c - 如何修复 realloc() : invalid next size in C

标签 c malloc realloc

当我尝试将文件作为数组加载到内存中时遇到问题。

我正在尝试将文件加载到数组中并再次打印出来,但我希望允许内存增长,因为文件长度可以是任意的。

当我在 Mac 上本地运行程序时,它似乎工作正常,但当我在 Ubuntu VM 上尝试时,出现以下错误 realloc():下一个大小无效
中止(核心转储)

我的代码如下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char **loadfile(char *filename, int *len);
int main(int argc, char *argv[])
{

  if (argc == 1)
   {
    printf("Usage add file\n");
    return 1;

  }

  int length = 0;
  char **words = loadfile(argv[1],&length);

printf("%d\n", length);

for (int i = 0; i < length; i++) {
  printf("%s\n",words[i]);
}
printf("Done\n");

  return 0;
}

char **loadfile(char *filename, int *len)
{
const int STEPSIZE = 10;

  FILE *f = fopen(filename,"r");
  if (!f) {
    fprintf(stderr, "Can't open file\n");
    return NULL;
  }
  int arrlen = STEPSIZE;
   char **lines = (char **)malloc(STEPSIZE);
   char buf[100];
   int i = 0;
   int counter = 2;
   while (fgets(buf,100,f))
   {

     if (i == arrlen)
     {
        counter++;
       arrlen += STEPSIZE;
       char **newlines = (char **)realloc(lines,counter * STEPSIZE);
       if(!newlines)
       {
      printf("Out of memory\n");
      //return 2;
       }
       lines = newlines;
     }

    buf[strlen(buf)-1] = '\0';

    int slen = strlen(buf);

    char *str = (char *)malloc(slen + 1 *sizeof(char ));
    strcpy(str, buf);
    lines[i] = str;
    i++;
   }
   *len =i;
   return lines;
}

我一生都找不到问题所在。

我只能假设问题出在本节中的某个地方,但我可能是错的:

 if (i == arrlen)
     {
        counter++;
       arrlen += STEPSIZE;
       char **newlines = (char **)realloc(lines,counter * STEPSIZE);
       if(!newlines)
       {
      printf("Out of memory\n");
      //return 2;
       }
       lines = newlines;
     }

非常感谢您的帮助

最佳答案

const int STEPSIZE = 10;

char **lines = (char **)malloc(STEPSIZE);

char **newlines = (char **)realloc(lines,counter * STEPSIZE);

您不想分配 10 个字节,而是分配 10 个 char * 元素的内存。因此,对 lines[i] = str; 的某些后续访问无效。

你想做的是:

char **lines = malloc(sizeof(*lines) * STEPSIZE);
char **newlines = realloc(lines, sizeof(*newlines) * counter * STEPSIZE);

或者您可以使用sizeof(char*)

另外:

char *str = (char *)malloc(slen + 1 *sizeof(char ));

虽然它是正确的并且会起作用,因为 sizeof(char) 是 1,但更清楚的意图是:

char *str = malloc((slen + 1) * sizeof(char));

另外,想想也很好if you should cast the result of malloc .

关于c - 如何修复 realloc() : invalid next size in C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58816574/

相关文章:

c - 为什么设置了 -std=c99 后 gcc 找不到 random() 接口(interface)?

c - 如何在 ANSI C 中用 NULL 替换字符串中的字符?

c - 执行返回-Ubuntu

c - if else 递归最差时间复杂度

c - 读取多行直到 EOF

c - 为什么会出现 C malloc 断言失败?

c - fscanf() 和 realloc() - 将文件读取到矩阵

c - 我的程序在递归函数中使用 realloc() 就崩溃了

c - 在 C 中从文件读取大数(例如 e 和 pi)到数组

c - Malloc 和 Realloc 的关系,当所需空间在内存中不可用时如何处理