繁体   English   中英

分配的内存地址冲突

[英]Allocated memory address clash

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

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

, or what in C is sometimes called "automatic storage." i的内存是从 ,或者C中的内容有时称为“自动存储”。

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

在程序执行过程中看到i&i的地址已经存在的原因是,堆栈存储区一直在重复使用。 在gdb中看到之前,您已经将堆栈变量的地址存储在node->path->next

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

两种可能性:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM