在要将可变大小的单词添加到字符串数组时,是否存在使用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);
}
答案 0 :(得分:1)
您似乎以错误的方式将nwords
初始化为0
。由于已将其声明为指针,因此无法直接访问它。相反,您应该使用取消引用运算符*
。
在main
函数中进行以下更改
*nwords = 0;
而不是nwords = 0;
nwords = 0
将nwords
指向的位置修改为地址0
的位置,您无权访问且无法分配该地址。
警告:
realloc
,如果NULL
失败,它将使指向位置realloc
,从而导致先前存在的数据丢失。相反,按照@David的建议,您可以使用临时变量存储realloc
,然后检查是否不是NULL
,然后将其内容分配给words
指针。 //your code
char *tmp = realloc(words, /* new size*/);
if(tmp != NULL)
words = tmp;
// your code
realloc
时,通常使用它来分配数据块,而不是用于单个位置。答案 1 :(得分:0)
初始化nwords
的值时,您正在覆盖其指针地址,而不是其值。
此外,正如评论者所说,行char **words = malloc(sizeof(char));
不正确。但是您总是要重新分配变量words
,因此代码仍可以按预期工作。为了使其超级安全,您应该将其更改为char **words = malloc(sizeof(char*));
我使用*nwords = 0;
行,现在它可以按预期运行。
#define BUFSIZ 1000
#include<stdio.h>
// 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, " ");
printf("word='%s'\n",word);
do{
*nwords=*nwords+1;
printf("nwords=%d\n",*nwords);
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);
}