未知的Malloc堆栈溢出c

时间:2018-01-15 14:32:08

标签: c pointers stack malloc stack-overflow

我编写了一段代码,它将几个整数(多达100 000个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堆栈溢出

谢谢

洛伦佐

P.S。对不起的家伙,但我试图让我的代码更短,但我写的是没有意义。我现在修好了(或者我希望如此)。

1 个答案:

答案 0 :(得分:1)

您过度使用变量列表。

您需要将指针保留为当前节点,而不是使用以下行覆盖它:

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()分开的函数中。

分段错误的实际原因不在您显示的代码中,但在您当前的代码中,当您尝试使用list时,它是NULL,这可能是您未定义的行为。