代码之家  ›  专栏  ›  技术社区  ›  Jamie Yang

C中的双自由或损坏(fasttop)错误/分段错误

  •  0
  • Jamie Yang  · 技术社区  · 10 年前

    我正在尝试动态分配一个数组以从命令行读取用户输入。它可以工作99/100次,但如果我重复输入一堆字符,有时会出现分段错误或双自由或损坏(fasttop)错误。这个错误相对难以再现。

    我很确定发生错误是因为我重新分配数组的方式。

    while(1){
            char *buf_in;               // Holds user keyboard input
            int cnt = 0, length = 0;    // cnt stores current read buffer size, length allows input into buf_in
            char ch;
            int buf_max = 64;           // Current buffer size. Dynamically allocated
    
            buf_in = malloc(buf_max * sizeof(char));
            if (buf_in==NULL){
                fprintf(stderr,"Error allocating memory!\n");
                exit(EXIT_FAILURE);
            }
    
            do{
                if (cnt > (buf_max/2)){
                    cnt = 0;
                    buf_max *= 2; // Double size of buffer
                    printf("Doubling buffer: %d\n",buf_max);
                    buf_in = realloc(buf_in,buf_max);
                    if (buf_in == NULL){
                        fprintf(stderr,"Error re-allocating memory!\n");
                        exit(EXIT_FAILURE);
                    }
                }
                /* Store line-by-line into buffer */
                ch = getc(stdin);
                buf_in[length] = ch;
                length++;
                cnt++;
            }while(ch != '\n');
    
            /* Handles different option arguments */
            processOptions(buf_in,&opt_n_inc);
    
            // stdout
            fprintf(stdout,"%s",buf_in);
            fflush(stdout);
    
            free(buf_in);
            buf_in=NULL;
        }
    
    1 回复  |  直到 10 年前
        1
  •  1
  •   chux    10 年前

    代码似乎正在尝试使用打印 "%s" 一个数组 char 而不是字符串。空字符 '\0' 缺少终止。

    同样,问题也可能表现在 processOptions() 因为该函数调用不传递有效数据的长度。

    buf_in[length] = ch;
    
    // Add    
    buf_in[length+1] = '\0';
    
    ...
    processOptions(buf_in,&opt_n_inc);
    fprintf(stdout,"%s",buf_in);
    

    注意:无限循环应该 getc(stdin) 回来 EOF 。更好用

    int ch = getc(stdin);
    if (ch == EOF) break;
    buf_in[length] = ch;