为什么没有创建新节点?

时间:2011-06-14 23:43:05

标签: c

我在c代码中有以下方法。

    void add(int number)
    {
    Node node1; // a new node should be created
    createNodeRelationshipBetween(&node1, current);
    setData(&node1, number);
    setCurrentNode(&node1);
    incrementSize();
    printf("Inserted Node [data:- %d, Node address:- %p\n", node1.data, &node1);
   }

其中Node被定义为

typedef struct node
 {
    struct node *prior;
    struct node *next;
    int data;
 } Node;

我在循环中调用add()。我的理解是每次调用add(i)时,都应该创建一个新的Node。相反,当我打印node1的地址时,每次都是相同的。有人可以解释错误的位置以及如何创建新节点?

5 个答案:

答案 0 :(得分:5)

该代码在堆栈上创建Node结构。一旦您离开该节点被销毁的功能。指针是相同的,因为它每次指向堆栈上的相同局部变量。解决方案是使用malloc

之类的内容为变量在堆上分配空间
malloc( sizeof( Node ) )

然后,您可以按照自己的方式使用返回的指针。完成后不要忘记free节点。

答案 1 :(得分:3)

您的函数确实会创建一个新的Node,但仅作为局部变量。当您的add()函数返回时,它会消失。如果你在循环中调用add(),那么堆栈上Node对象的地址总是一样的。

要使新的Node持续存在,您需要为其分配一些持久性内存 - 请查看malloc(3)free(3)。一个简单的例子:

Node *node1 = malloc(sizeof(Node));

您需要跟踪node1指针,以免引入内存泄漏。您可以稍后使用free(3)来销毁分配。

答案 2 :(得分:1)

node1是一个局部变量,因此每次调用函数时都会重新创建它,并在每次返回时被销毁。

答案 3 :(得分:1)

node1是你的add函数的本地 - 如果你想让它在该函数之外持久化,那么使用malloc

分配堆

答案 4 :(得分:1)

新行Node不是由行Node node1;创建的。该行仅声明一个变量,其范围仅限于函数的生命周期(即,变量放在堆栈上)。当函数返回时,node1不再存在。

由于您在紧密循环中调用add(),可能发生的事情是每次调用add()都会被分配相同的堆栈范围而node1碰巧具有相同的堆栈范围每次调用函数时都会解决。

如果add()的每个调用都需要具有唯一地址的唯一node1,那么您需要使用malloc动态分配对象。