这只是一个测试代码,我一直在使用它来弄清楚代码是如何工作的,然后才将其强加到我的程序中。基本上同样的问题发生在两个程序中,我能够重新分配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;
}
我在这里搞砸了什么?
答案 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()
的结果。