我不明白这是怎么发生的。这是我的部分代码..
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编译的 任何帮助将不胜感激..
最佳答案
i
的内存取自堆栈,或者在 C 中有时称为“自动存储”。
在声明存储返回的函数后,从堆栈分配的内存内容不再有效。例如,您的 isGoal()
函数为变量 i
分配堆栈存储空间,并且该存储空间仅存在到 isGoal()
的时间点返回。
之所以在你的程序中看到i
、&i
的地址已经存在,是因为栈内存区域不断被重用。在您在 gdb 中看到之前,您已经将堆栈变量的地址存储在 node->path->next
中。
要获得在分配函数返回后仍然有效的内存,您必须使用 malloc()
和 free()
来获得所谓的“动态内存”或,有时,来自“堆”的内存。
关于c - 分配的内存地址冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2624695/