2010-04-12 52 views
0

我不明白这是如何发生的。这是我的代码部分..分配的内存地址冲突

int isGoal(Node *node, int startNode){ 

     int i; 
    . 
    . 
    } 

当我调试这个用gdb我发现,“我”在先前已分配的内存地址分配。

(gdb)print &node->path->next 
$26 = (struct intNode **) 0xffbff2f0 

(gdb) print &i 
$22 = (int *) 0xffbff2f0 

node-> path-> next已经在这个函数之外定义了。但是你可以看到它们共享相同的地址,当计数器发生变化时,某些时候指针会指向另一个地方。

我使用gcc在Solaris平台 任何帮助将非常感激它编译..

回答

0

两种可能性:

  • 你已经优化编译的,这是令人困惑的gdb(例如i可能是优化掉,所以它实际上没有任何地址)
  • node->path没有指向正确分配的内存。例如,该指针可能已被设置为指向堆栈中随后超出范围的对象。
+0

第一个不是真正的可能性。您提供的第二个想法由他从gdb发布的数据证实。他在他的数据结构中使用了一个地址。你可以知道这一点,因为我明显在堆栈中。 – 2010-04-12 19:25:13

+0

Thx的确,我创建了node-> path作为一个本地变量,之后我malloc它现在好了.. – Louis 2010-04-12 19:40:44

3

i为存储器从,或在什么C截取有时被称为“自动存储”。

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

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

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

+0

Thx的确,我创建了node-> path作为一个本地var,之后我malloc它现在好了 – Louis 2010-04-12 19:41:21

+0

甜。我看到你是新来的。如果您接受我的回答,您可以点击复选框的大纲。这会将您的视图转换为填充的绿色复选框,表示您已接受我的答案。结果,你得到了一些积分,我得到了15分。而且,现在你已经调用了malloc(),想象你正在编写一个程序来运行数周和数周。在这种情况下,在您不再跟踪以前分配的内存时调用free()是非常重要的。例如,您可以在从路径列表中删除项目时释放()您的数据结构。 – 2010-04-12 19:45:26