2017-09-27 89 views
0

我在C中实现了一个链表程序,create_node函数给出了一个警告:函数返回局部变量的地址。我已阅读关于使用malloc,但我想了解没有它的原始问题和解决方案。谢谢。链接列表函数返回本地变量的地址

struct list_node_s* Create_node(int val, struct list_node_s* node_p) { 
    struct list_node_s temp; 

    temp.data = val; 
    temp.next_p = node_p; 
    return &temp; 
} /* Create_node */ 
+1

相关https://stackoverflow.com/q/4824342/694576如果不是重复的。 – alk

+0

这是一件很难解释的一条腿,但我会试图成为simpale 问题是当你创建一个变量没有** malloc ** - 幕后你把变量放在堆栈上 - 内存段这节省了您当前代码段的一些问题。 – Bizzu

+0

当你跳转到函数时,你从某个点向你的堆栈添加东西,当你完成时(从无效函数返回或完成void函数),你从入口点释放所有你保存的东西。 这意味着 - 在您的特定代码中,您尝试返回您保存在堆栈中的某个地址的地址,但是当您返回时释放堆栈 - 您尝试返回您“释放”的某些东西。 。 – Bizzu

回答

0

的问题是,你的temp变量是本地变量。它具有函数范围,所以只要程序在函数中就存在。这通常通过堆栈来实现。

您应该使用malloc获得内存,这是所有动态分配的来源。这样,列表及其节点将存在,直到您明确销毁它们并使用free

唯一的其他解决方案,我不建议使用递归函数调用来构建您的列表。而且只要你使用清单永远不会返回

我看到了一次。这是可怕的。但可能。