c返回字符**给我错误"地址0x0不是堆叠的,恶意的或空闲的

  • 本文关键字:恶意 0x0 字符 返回 错误 地址
  • 更新时间 :
  • 英文 :


我需要返回一个字符串列表。从文件中读取这些字符串(文件的每行中的每个字符串)。下面的代码不能工作:

void getStrings(char **container, FILE* file, int *numberOfLetters) {
  char* line = NULL;
  size_t l = 0;
  ssize_t r;
  container =  (char**) malloc (sizeof(char*));
  size_t lettersNumber= 1;
  size_t numberOfStrings = 0;
  size_t sizeOfContainer = 1;
  while ((r = getline(&line, &l, file)) != -1) {
    line[strlen(line) - 1] = '';
    lettersNumber = lettersNumber + strlen(line);
    if (numberOfStirngs == sizeOfContainer) {
      sizeOfContainer= sizeOfContainer * 2;
      char** temp = calloc(sizeOfContainer, sizeof(char**));
      for (int k = 0; k < l; k++) {
        temp[k] = container[k];
      }
      free(container);
      container = temp;
    }
    container[numberOfStrings] = line;
    numberOfStrings++;
  } 
  if (line) {
    free(line);
  }

因为您在每一步中都对整个指针数组进行了calloc处理,因此您丢失了之前迭代中的所有字符串,并且始终只保留最后一行。由于您使用calloc,所有这些指针都是空的,因此您的错误消息

预见到这些事情的工具是realloc,而不是malloccalloc,以保持您已经存储的值。

似乎还有其他问题。例如,你只有一个line,你所有的行都被复制到那个,所以以前的行总是被覆盖。正如BLUEPIXY正确指出的那样,您只将函数参数的值更改为新值,而不会将新值返回给调用者。

那么,在每次迭代中重新分配内存是真正的浪费。你应该想出一个更有效的策略。