分配的内存地址冲突

时间:2010-04-12 19:15:54

标签: 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编译它 任何帮助都会非常感激..

2 个答案:

答案 0 :(得分:3)

i的内存取自堆栈,或者C中的内容有时称为“自动存储”。

在声明存储已返回的函数之后,从堆栈分配的内存内容不再有效。例如,您的isGoal()函数为变量i分配堆栈存储,并且存储仅在isGoal()返回的时间点之前存在。

您在程序中看到i&i的地址已经存在的原因是堆栈内存区域不断被重用。在gdb中看到之前,您已在node->path->next中存储了堆栈变量的地址。

要获取在返回分配函数后仍然有效的内存,必须使用malloc()free()来获取所谓的“动态内存”,或者有时来自“堆”的内存。

答案 1 :(得分:0)

两种可能性:

  • 您已使用优化进行编译,这会让gdb感到困惑(例如,i可能会被优化掉,因此它实际上没有任何地址)
  • node->path未指向正确分配的内存。例如,指针可能已被设置为指向堆栈上随后超出范围的对象。