代码之家  ›  专栏  ›  技术社区  ›  Dennis Haarbrink

程序有25%的时间不正常

c
  •  1
  • Dennis Haarbrink  · 技术社区  · 14 年前

    灵感来自 this topic ,我决定写一个简单的程序来实现这一点。
    逻辑并不复杂,我75%的时间都有一个工作程序。。询问的数量定义为 #define BUFSIZE x ,在哪里 x 可以是任意整数。
    ((BUFSIZE+1) % sizeof(int)) == 0 .

    例如,如果 BUFSIZE=10 ,当 BUFSIZE=11 我的行为很古怪。

    #include <stdio.h>
    #include <stdlib.h>
    #define BUFSIZE 7
    
    int max(int *buf);
    
    int main()
    {
        int bufsize = BUFSIZE, *buf = malloc(sizeof(int[bufsize]));
    
        // read values
        int *ptr = buf;
        while(--bufsize + 1)
        {
            printf("Input %d: ", BUFSIZE - bufsize);
            scanf("%d", ptr);
            ++ptr;
        }
    
        // reset pointer and determine max
        ptr = buf;
        printf("\nMax: %d\n", max(ptr));
        // cleanup
        free(buf);
        ptr = NULL;
        buf = NULL;
    
        exit(EXIT_SUCCESS);
    }
    
    int max(int *buf)
    {
        int max = 0;
        while(*buf)
        {
            printf("%d\n", *buf);
            if(*buf > max) max = *buf;
            ++buf;
        }
        return max;
    }
    

    suze:/home/born05/htdocs/experiments/c# gcc input.c && ./a.out
    Input 1: 12
    Input 2: 23
    12
    23
    
    Max: 23
    
    suze:/home/born05/htdocs/experiments/c# gcc input.c && ./a.out
    Input 1: 12
    Input 2: 23
    Input 3: 34
    12
    23
    34
    135153
    
    Max: 135153
    

    我觉得这是一件非常合乎逻辑的事情,但我不能指出这种错误行为的确切原因。有人能给我指出(也许是明显的)缺点吗?

    3 回复  |  直到 7 年前
        1
  •  5
  •   Tyler McHenry    14 年前

    这实际上是纯粹的运气,这甚至适用于任何的价值观 BUFSIZE BUFSIZE=2

    while(*buf)
    

    不是检查缓冲区结尾的适当方法。它的作用是在 buf 数组和调用未定义的行为。

    您要么需要在最后分配一个额外的元素 0 max

        2
  •  2
  •   sharptooth    14 年前

    这个

    int bufsize = BUFSIZE, *buf = malloc(sizeof(int[bufsize]));
    

    应该是

    int bufsize = BUFSIZE, *buf = malloc(sizeof(int[BUFSIZE + 1]));
    buf[BUFSIZE] = 0;
    

    在当前代码中,为一个整数分配内存( sizeof(int[bufsize]) sizeof(int*) )相反,你需要的是记忆 BUFSIZE 整数和一个包含null的额外整数。

        3
  •  1
  •   Amardeep AC9MF    14 年前

    能够 如果您的数据值被保证永远不为零,并且您实际将零放在那里(您的程序没有这样做)。

    相反,尝试将max()函数更改为以下内容(相应地调整原型和调用位置):

    int max(int *buf, int count)
    {
        int max = 0;
    
        // Check inputs
        if (buf == NULL || count <= 0)
        {
            printf("max(): bad parameter(s)\n");
            return 0;
        }
    
        while(count--)
        {
            printf("%d\n", *buf);
            if(*buf > max) max = *buf;
            ++buf;
        }
        return max;
    }