未知的Malloc堆栈溢出c
我写了一段代码,它将几个整数(多达100000个int)作为文件的输入,并将它们存储在“递归”结构中。
只要我在我的电脑上运行这段代码,一切都很好。
代码如下:
typedef struct node{
int data;
struct node* next;
} node;
...
node* create(void){
node* list = (node*)malloc(sizeof(node));
return list;
}
node* insert(node* list, int temp){
if(list == NULL){
list = create();
list->data = temp;
list->next = NULL;
return list;
}
list->next = insert(list->next, temp);
return list;
}
int main(void){
...
node* list = NULL;
while(there is still data to input){
list = insert(list, data);
}
}
但是,当我尝试在Android手机上运行此代码时,我得到了一个
malloc堆栈溢出错误
(我知道在手机上保留的堆栈空间不如PC上的那个)。
问题是,据我所知,这个程序应该使用大量的堆栈内存。
这是我认为在我的程序中发生的事情(如果我错了,请纠正我):
1)。 node* list = NULL
==>指针的空间(8字节)在堆栈上分配;
2)。 list = insert(list, temp)
==>进入数据流的末尾。
3)。 list = create()
==>调用create()函数;
4)。 node* list = (node*)malloc(sizeof(node))
==>指针的空间分配在堆栈上(8字节),结构空间分配在堆上(16字节)。
5)。 return list
==> create()
函数是关闭的,因此栈中的变量node* list
将被“释放”,同时堆中分配的空间依然存在。
所以我的程序应该使用大量的堆内存,但只有8字节的堆栈内存(main ==> node* list = NULL
的第一个指针所需的内存),我怎么可能得到错误:
malloc堆栈溢出
?
谢谢
洛伦佐
Ps对不起,但我试图让我的代码更短,但我写的是没有意义的。 我现在修复它(或者我希望如此)。
您正在过度使用变量列表。
您需要保留指向当前节点的指针,而不是用行覆盖它:
list = create();
考虑以下或类似:
int main(void){
...
node* list = NULL;
node* current = NULL;
node* next = NULL;
while(...){
...
next = create();
if(list == NULL) //list empty case
{
list = next;
current = next;
}
current->next = next;
next->next = NULL;
current = next;
}
}
我鼓励你将这些逻辑的一部分封装在与main()分开的函数中。
分段错误的实际原因不在您显示的代码中,而是在您当前的代码中,当您尝试使用列表时,它是NULL,这可能是您未定义的行为。
链接地址: http://www.djcxy.com/p/80449.html