【问题标题】:Allocated memory address clash分配的内存地址冲突
【发布时间】:2010-04-12 19:15:53
【问题描述】:

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

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

【问题讨论】:

    标签: c memory stack memory-address


    【解决方案1】:

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

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

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

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

    【讨论】:

    • Thx,确实,我在外部创建了 node->path 作为本地 var,在我 malloc 之后它现在很好
    • 甜蜜。我看你是新来的。如果您接受我的回答,您可以单击复选框的轮廓。这会将您的视图转换为填充的绿色复选框,表示您已接受我的回答。结果,你得到了一些分数,而我得到了 15 分。另外,现在你已经调用了 malloc(),想象你正在编写一个连续运行数周和数周的程序。在这种情况下,当您不再跟踪先前分配的内存时调用 free() 至关重要。例如,您可以在从路径列表中删除项目时释放()您的数据结构。
    【解决方案2】:

    两种可能:

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

    【讨论】:

    • 第一种可能性不大。他从 gdb 发布的数据证实了您给出的第二个想法。他在他的数据结构中使用堆栈外的地址。您可以知道这一点,因为 i 显然在堆栈中。
    • Thx,确实,我在外部创建了 node->path 作为本地 var,在我 malloc 之后它现在很好..
    猜你喜欢
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 2012-10-29
    • 1970-01-01
    相关资源
    最近更新 更多