gpt4 book ai didi

c - realloc,用于 C 中的字符串数组

转载 作者:太空宇宙 更新时间:2023-11-04 03:14:37 26 4
gpt4 key购买 nike

当您想将可变大小的单词添加到字符串数组时,是否有使用 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);
}

最佳答案

您似乎以错误的方式将 nwords 初始化为 0。由于您已将其声明为指针,因此无法直接访问它。相反,您应该使用取消引用运算符 *

main 函数中进行以下更改

*nwords = 0; 而不是 nwords = 0;

nwords = 0nwords 指向的位置修改为地址为 0 的位置,您无权访问并且不能赋值。

警告:

  1. 最好不要对同一个指针进行realloc,如果realloc失败会使指向的位置NULL,导致先前存在的数据丢失。相反,正如@David 建议的那样,您可以使用临时变量来 realloc 内存,然后检查它是否不是 NULL 然后将其内容分配给 words 指针。
    //your code
char *tmp = realloc(words, /* new size*/);
if(tmp != NULL)
words = tmp;
// your code
  1. 在使用 realloc 时,您通常使用它来分配数据 block ,而不是分配一个位置。

关于c - realloc,用于 C 中的字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53154478/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com