gpt4 book ai didi

c - 为什么 realloc() 在第二个循环后崩溃?

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

这只是一个测试代码,我一直在使用它来弄清楚代码是如何工作的,然后再将其应用到我的程序中。基本上相同的问题发生在两个程序中,我能够重新分配 2 次然后崩溃。最终项目是一个二维指针,列表长度和大小长度。其中每一个都必须能够调整到合理的限制。

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

int main()
{
char** tasks;
char buff[1089];
int size, i, list_size=1;
tasks = (char**)malloc(list_size * sizeof(char*));
printf("input a string!\n");
gets(buff);
*tasks[0]=(char*)malloc((strlen(buff)+1));
tasks[0]=buff;
printf("%s\n", tasks[0]);

for (i=1;i<8 ;i++){
list_size++;
printf("%d\n", list_size);
*tasks = realloc(*tasks, list_size* sizeof(char*));
printf("input a string!\n");
gets(buff);
*tasks[i]=(char*)malloc((strlen(buff)+1));
tasks[i]=buff;
printf("%s\n", tasks[i]);
}

free(tasks);
return 0;
}

我在搞什么鬼?

最佳答案

这里有几个问题。

*tasks[0]=(char*)malloc((strlen(buff)+1));

正如 David Heffernan 在评论中指出的那样,您正在将指针分配给 char。您可能只是想分配给 tasks[0]

tasks[0]=buff;

这不是复制字符串的方式。您将 tasks[0] 设置为指向您的固定缓冲区,并泄漏了您在上一步中分配的内存。

*tasks = realloc(*tasks, list_size* sizeof(char*));

这不是一种安全的重新分配方式,而且您也重新分配了错误的指针(列表中的第一个条目,而不是列表本身)。如果分配失败,则您丢失了原始指针,并泄漏了该内存。您应该首先重新分配一个临时变量,如下所示:

char *temp = realloc(tasks, list_size* sizeof(char*));
if (temp != NULL)
tasks = temp;

最后,不要强制转换 malloc() 的结果。

关于c - 为什么 realloc() 在第二个循环后崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21517688/

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