【发布时间】:2016-03-30 17:08:33
【问题描述】:
我修改了很多次的这段代码有问题(但总是出现错误): 似乎在释放“过滤器”的最后一个索引时出错
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;
}
这是输出:
0x1521030
HOME
0x1521050
2
0x1521070
A
0x1521010
8
0x15210c0
D
*** Error in `./test': free(): invalid pointer: 0x00000000015210c0 ***
我还尝试使用 valgrind 调试它(它说分配器尝试释放 9 个字节,而字符总和为 8,很奇怪,不是吗?)和 gdb 但没有任何效果。 input.txt的第一行是“HOME 2 A 8 D\n”
【问题讨论】:
-
没有文档价值的变量名会让小猫哭泣。
j?t?好的,在花时间阅读代码时很容易弄清楚它们,但您可以通过合理的命名使其更容易。即使您不想让自己变得更容易,当您要求其他人无偿帮助您解决问题时,您也应该让他们尽可能简单地完成任务。除此之外,您的输出似乎与您提供的程序不匹配;在您的代码未打印的每个字符串之前,似乎都有指针值。 -
这些语句在释放时产生了问题 -
buf[len++] = ch;。当您更改指针指向的内容时。 -
@ameyCU 嗯,不,这不会以任何方式改变任何指针
-
还有一个可能应该在
case '\n'中的break 语句。如果您打算让代码不间断地流过下一个,您真的想在此处添加注释以表明它。 -
分配大小为 9,因为 C 字符串中嵌入了
NUL
标签: c pointers malloc free realloc