重新分配,用于C

时间:2018-11-05 12:30:36

标签: c pointers realloc

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

2 个答案:

答案 0 :(得分:1)

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

main函数中进行以下更改

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

nwords = 0nwords指向的位置修改为地址0的位置,您无权访问且无法分配该地址。

警告:

  1. 最好不要在同一指针上执行realloc,如果NULL失败,它将使指向位置realloc,从而导致先前存在的数据丢失。相反,按照@David的建议,您可以使用临时变量存储realloc,然后检查是否不是NULL,然后将其内容分配给words指针。
    //your code
    char *tmp = realloc(words, /* new size*/);
    if(tmp != NULL)
        words = tmp;
    // your code
  1. 在使用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);
}