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"
第一次执行这些行
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)
所以你写的超出了分配的内存,因此有不确定的行为.同样,每次扩展缓冲区长度.