我不明白这是怎么发生的。这是我的代码的一部分..
int isGoal(Node *node, int startNode){
int i;
.
.
}
当我使用gdb进行调试时,我发现'i'是在以前分配的内存地址中分配的。
(gdb)print &node->path->next
$26 = (struct intNode **) 0xffbff2f0
(gdb) print &i
$22 = (int *) 0xffbff2f0
node-> path-> next已经在此函数之外定义。但正如你可以看到他们共享相同的地址,当某个地点指针指向另一个地方时 i 计数器被更改。
我在solaris平台上使用gcc编译它 任何帮助都会非常感激..
答案 0 :(得分:3)
i
的内存取自堆栈,或者C中的内容有时称为“自动存储”。
在声明存储已返回的函数之后,从堆栈分配的内存内容不再有效。例如,您的isGoal()
函数为变量i
分配堆栈存储,并且存储仅在isGoal()
返回的时间点之前存在。
您在程序中看到i
,&i
的地址已经存在的原因是堆栈内存区域不断被重用。在gdb中看到之前,您已在node->path->next
中存储了堆栈变量的地址。
要获取在返回分配函数后仍然有效的内存,必须使用malloc()
和free()
来获取所谓的“动态内存”,或者有时来自“堆”的内存。
答案 1 :(得分:0)
两种可能性:
i
可能会被优化掉,因此它实际上没有任何地址)node->path
未指向正确分配的内存。例如,指针可能已被设置为指向堆栈上随后超出范围的对象。