0

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

   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 编译它 任何帮助将不胜感激..

4

2 回答 2

3

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

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

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

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

于 2010-04-12T19:22:54.610 回答
0

两种可能:

  • 您已经使用优化进行了编译,这让 gdb 感到困惑(例如i可以优化掉,因此它实际上没有任何地址)
  • node->path没有指向正确分配的内存。例如,该指针可能已设置为指向堆栈上随后超出范围的对象。
于 2010-04-12T19:21:13.123 回答