奇怪的free()无效指针C.

JoA*_*unt 0 c malloc free pointers realloc

我修改了很多次这段代码的问题(但总是出现错误):似乎在释放"过滤器"的最后一个索引时出错

char** read_and_filter(int fd) {
  char buf[MAXLENGTH];
  char **bufs=NULL;
  char ch;
  int j = 0, len = 0, t = 0;
  while (!t && read(fd,&ch,1) == 1) {
    switch (ch) {
    case '\n':
      t = 1;
    case ' ':
      bufs = realloc(bufs, (j+1)*sizeof(char*));
      bufs[j++] = strndup(buf,len);
      memset(buf,0,len);
      len = 0;
      break;
    default:
      buf[len++] = ch;
    }
  }
  bufs[j] = 0;
  return bufs;
}

int main(int argc, char **argv) {
  char **filter;
  int i,fd = open("input.txt",O_RDONLY);
  filter = read_and_filter(fd);
  for(i = 0; filter[i]; i++) {
    printf("%s\n",filter[i]);
    free(filter[i]);
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是输出:

0x1521030
HOME
0x1521050
2
0x1521070
A
0x1521010
8
0x15210c0
D
*** Error in `./test': free(): invalid pointer: 0x00000000015210c0 ***
Run Code Online (Sandbox Code Playgroud)

我也尝试用valgrind调试它(它告诉我分配器试图释放9个字节,而字符总和是8,奇怪没有?)和gdb但没有任何效果.input.txt的第一行是"HOME 2 A 8 D \n"

Wea*_*ane 7

第一次执行这些行

bufs = realloc(bufs, (j+1)*sizeof(char*));
bufs[j++] = strndup(buf,len);
Run Code Online (Sandbox Code Playgroud)

你获得1个指针的内存(j为0).这为NULL您在函数末尾写入的结束留下了空间

bufs[j] = 0;
Run Code Online (Sandbox Code Playgroud)

所以你写的超出了分配的内存,因此有不确定的行为.同样,每次扩展缓冲区长度.


AnT*_*AnT 6

你bufs[j] = 0;在read_and_filter写入非分配内存的最后.你从来没有realloc用过bufs额外的东西0.