【发布时间】:2018-11-05 12:30:36
【问题描述】:
当你想将可变大小的单词添加到字符串数组时,是否有正确的方法来使用 realloc?我遇到了分段错误。 请告诉我有什么问题
// This function puts every word found in a text file, to a String array, **words
char **concordance(char *textfilename, int *nwords){
FILE * fp;
char *fileName = strdup(textfilename);
fp = fopen(fileName, "r");
if(fp == NULL) {
perror("fopen");
exit(1);
}
char **words = malloc(sizeof(char));
// char **words = NULL
char line[BUFSIZ];
while(fgets(line, sizeof(line), fp) != NULL){
char *word = strdup(line);
word = strtok(word, " ");
do{
words = realloc(words, (*nwords+1) * sizeof(char(*)));
words[*nwords] = word;
} while((word = strtok(NULL, " ")) != NULL);
}
return words;
}
int main(int argc, const char * argv[]) {
int *nwords = malloc(sizeof(int));
nwords = 0;
concordance("test.txt", nwords);
}
【问题讨论】:
-
char **words = malloc(sizeof(char));在我看来很可疑 -
您是否使用过调试器(gdb 或 valgrind)来检查您的程序?!
-
char **words应该分配给指针的大小和要存储的最大指针数,例如char **words = malloc(sizeof(char *)*1000);最多 1000 个指针。 -
安东尼奥。我试过了,还是不行
-
除非你真的知道自己在做什么,否则你真的不应该使用
strtok(),因为它会修改你正在扫描的字符串,用空值替换分隔符。