我正在尝试编写一个函数来将文本输入分配给char**
。每个单词存储在char*
中。当我这样做的时候,我遇到了错误,我认为我没有分配足够的内存,所以我写了一个小测试程序。
#include <stdio.h>
#include <stdlib.h>
int main(){
char **input=NULL;
char **help=NULL;
for(int i=1;i<300;i++){
help=realloc(input,i*(sizeof(char*)));
if (!help)
return 0;
input=help;
input[i]="test";
}
return 1;
}
现在这个工作正常,但是当我为每个字符分配如下时。
#include <stdio.h>
#include <stdlib.h>
int main(){
char **input=NULL;
char **help=NULL;
char *help2=NULL;
for(int i=1;i<300;i++){
help=realloc(input,i*(sizeof(char*)));
if (!help)
return 0;
input=help;
for (int j=1;j<5;j++){
help2=realloc(input[i-1],j);
if (!help2)
return 0;
input[i-1]=help2;
input[i-1][j-1]='t';
}
}
return 1;
}
我在第14行遇到了分段错误。我认为这是因为input
没有足够的空间。但由于角色的大小是一,我使用sizeof(char*)
我不知道它是不够的。我需要分配多少内存,为什么它在我的第一个例子中有效?谢谢!
答案 0 :(得分:1)
clang
立即发现问题。
test(72707,0x7fffe32443c0) malloc: *** error for object 0x7fffe0051090: pointer being realloc'd was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6
问题出在这里。
help2=realloc(input[i-1],j);
虽然已分配input
,但其元素均未初始化。如果指针为空,realloc
将像malloc
一样,但如果它被要求在input[i-1]
中重新分配未初始化的垃圾指针,它将会发疯。
相反,您必须在尝试input
其元素之前正确初始化realloc
。
诸如Valgrind之类的内存检查工具将有助于发现这些错误。