Malloc错误:释放对象的校验和不正确

Non*_*one 9 c debugging malloc pointers

我正在为一项任务实施尾部.我有它正常工作,但我似乎在随机时间免费获得错误.

我无法看到,追踪到一个模式或除了它之外的任何东西是一致的.

例如,如果我将我的程序称为"tail -24 test.in",我将在多次运行时在同一行中得到错误的校验和错误.但是,使用不同的文件,甚至不同的行数打印回来,我会回来没有错误.

关于如何追踪问题的任何想法,我一直试图调试它几个小时无济于事.

这是违规代码:

lines被定义为char**,并且malloc为:

lines = (char**) malloc(nlines * sizeof(char *));

void insert_line(char *s, int len){

  printf("\t\tLine Number: %d Putting a %d line into slot: %d\n",processed,len,slot);
  if(processed > numlines -1){//clean up
    free(*(lines+slot));
    *(lines + slot) = NULL;
  }
  *(lines + slot) = (char *) malloc(len * sizeof(char));
  if(*(lines + slot) == NULL) exit(EXIT_FAILURE);
  strcpy(*(lines+slot),s);
  slot = ++processed % numlines;
}
Run Code Online (Sandbox Code Playgroud)

Jay*_*ayG 7

您的例程正在写入超出分配的行缓冲区.

作为参数传递的行的大小(即"len")可能不包括NUL终止符.当你调用malloc复制行(即"s")时,你需要为字符串终止符分配一个额外的字节:

 *(lines + slot) = (char *) malloc((len + 1) * sizeof(char));
Run Code Online (Sandbox Code Playgroud)

  • 这个答案是如何被接受的?在发布此答案的前一天,原始海报对我的回答进行了评论,说"空调由调用函数计算". (3认同)