【问题标题】:realloc(): invalid pointer Aborted (core dumped)realloc():无效指针中止(核心转储)
【发布时间】:2019-07-22 03:18:26
【问题描述】:

我正在创建一个类似于 bash 的 shell。尝试获取与命令关联的参数时遇到错误(即 ls -l)。我在网上搜索过,没有发现任何有用的东西。

char *userInCopy;
char *ret;
userInCopy = (char*)calloc(1024, sizeof(char));
ret = (char*)calloc(64, sizeof(char));
strcpy(userInCopy, userIn);
int i = 0;
while((ret = strsep(&userInCopy, " "))){
    *(args + i) = (char*)calloc(strlen(ret), sizeof(char));
    strcpy((*(args+i)), ret);
    i++;
    ret = (char*) realloc(ret, (64)* sizeof(char));
} 

我在 char userIn 中从用户那里获得输入,并且分配正确。然后我使用 strsep 解析输入,分别获取每个参数。我可以得到 ls 参数和 -l 参数,但是当它在 -l 之后进入 realloc 时,它给了我“realloc():无效指针”错误。我不知道为什么这会在获得 ls 参数后第一次起作用,但在获得 -l 参数后却失败了。有什么建议吗?

【问题讨论】:

  • 你给realloc的尺寸是新的total尺寸。这不是它应该添加多少额外的东西。另请注意,您永远不应分配回您传入的指针,因为realloc 可能会失败并返回NULL,在这种情况下您会丢失原始指针。最后,在 C 中你 should not cast the result of malloc, calloc or realloc.
  • 另外,strsep 函数是 POSIX 标准函数,而不是 C 标准函数。只是让您知道是否要在其他平台上使用它。
  • 文体要点:不要使用*(args + i)。相反,使用等效但更清晰的args[i]。

标签: c memory realloc coredump


【解决方案1】:

问题是您正在用strsep 返回值覆盖ret。

while((ret = strsep(&userInCopy, " "))) //Here

有另一个临时变量来存储strsep return。


来自realloc man page。

void *realloc(void *ptr, size_t size);

ptr 必须由先前对 malloc()、calloc() 的调用返回 或重新分配()。

【讨论】:

  • 但是那个临时返回值是否也需要为循环的每次迭代分配和重新分配内存,这导致我回到我现在遇到的同一个问题?
  • 不,您的临时变量不需要内存分配。
  • 所以我也会改变它:char *temp; while((temp = strsep(&userInCopy, " "))){ ... strcpy(args[i], temp); }
  • @epartridge 是的。
猜你喜欢
  • 1970-01-01
  • 2021-03-11
  • 2020-12-05
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 2017-02-01
  • 2021-04-18
  • 1970-01-01
相关资源
最近更新 更多