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

时间:2014-02-02 23:28:06

标签: c 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;
}

我在这里搞砸了什么?

1 个答案:

答案 0 :(得分:2)

这里有几个问题。

*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()的结果。