c - 分配的内存地址冲突

标签 c memory stack memory-address

我不明白这是怎么发生的。这是我的部分代码..

   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/

相关文章:

iOS 内存管理工具

c++ - 从堆栈中删除一个对象?

c - 元素没有被弹出

c++ - 是否需要显式对齐?

c# - 什么时候结构不在栈上?

c - 无法将结构指针分配给内存数组

c++ - XSD 限制可以特定于平台吗?

c - PROCESS_EXTENDED_BASIC_INFORMATION 结构中标志的含义?

c - 这个 clang 优化是一个错误吗?

memory - 皮质_M4_0 : error occurs in GPIO code in debug mode