为什么realloc()在第二次循环后崩溃?
这只是一个测试代码,我一直在用它来弄清楚代码是如何工作的,然后再将它推进到我的程序中。基本上相同的问题发生在这两个程序中,我可以realloc 2次然后崩溃。最后一个项目是2d指针、列表长度和大小长度。其中每一个都必须能够调整到合理的限制为什么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
#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++的经验)。我想你对我的帮助比我的老师更大。