为什么realloc()在第二次循环后崩溃?

为什么realloc()在第二次循环后崩溃?,c,realloc,C,Realloc,这只是一个测试代码,我一直在用它来弄清楚代码是如何工作的,然后再将它推进到我的程序中。基本上相同的问题发生在这两个程序中,我可以realloc 2次然后崩溃。最后一个项目是2d指针、列表长度和大小长度。其中每一个都必须能够调整到合理的限制 #include <stdio.h> #include <stdlib.h> int main() { char** tasks; char buff[1089]; int size, i, list_size

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

#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;
}
#包括
#包括
int main()
{
字符**任务;
字符buff[1089];
int size,i,list_size=1;
tasks=(char**)malloc(list_size*sizeof(char*);
printf(“输入字符串!\n”);
获得(buff);
*任务[0]=(char*)malloc((strlen(buff)+1));
任务[0]=buff;
printf(“%s\n”,任务[0]);
对于(i=1;i这里有几个问题

*tasks[0]=(char*)malloc((strlen(buff)+1));
正如David Heffernan在评论中指出的那样,您正在分配一个指向
char
的指针。您可能只是想分配给
任务[0]

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

*tasks = realloc(*tasks, list_size* sizeof(char*));
这不是一种安全的realloc方法,而且您也重新定位了错误的指针(列表中的第一个条目,而不是列表本身)。如果分配失败,您就丢失了原始指针,并泄漏了内存。您应该首先将realloc重新定位到一个临时变量,如下所示:

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

最后,不要抛出
malloc()

*tasks[0]
类型为
char
。您正在为其分配一个地址。所有赌注均已取消。
tasks[0]=buff
分配一个指针。基本上,这段代码是一场彻底的灾难。你需要后退一步,掌握基本知识。走路之前不要跑。不要投射
malloc
返回值。添加错误检查。正确地执行
realloc
。如果失败,你的代码会泄漏。感谢这两个,我的实验室讲师告诉我,这是我自己的原因我不想学linux编程,所以我迷路了。这是我第一次用C语言编程(我有一些C++的经验)。我想你对我的帮助比我的老师更大。