我在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的地址时,每次都是相同的。有人可以解释错误的位置以及如何创建新节点?
答案 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
动态分配对象。