C 分配内存地址冲突
我不明白这是怎么发生的。这是我代码的一部分C 分配内存地址冲突,c,memory,stack,memory-address,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
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
节点->路径->下一步已在此函数之外定义。但是正如你所看到的,当i计数器改变时,它们共享相同的地址,在某个点上使指针指向另一个地方
我在solaris平台上使用gcc编译了它
非常感谢您的帮助。有两种可能:
- 您已经使用优化进行了编译,这让gdb感到困惑(例如,
可以被优化掉,所以它实际上没有任何地址)i
未指向正确分配的内存。例如,该指针可以设置为指向堆栈上随后超出范围的对象节点->路径
- 您已经使用优化进行了编译,这让gdb感到困惑(例如,
可以被优化掉,所以它实际上没有任何地址)i
未指向正确分配的内存。例如,该指针可以设置为指向堆栈上随后超出范围的对象节点->路径
- 有两种可能性:
i
的内存取自堆栈,或者C语言中有时称之为“自动存储”
函数声明存储已返回后,从堆栈分配的内存内容不再有效。例如,您的isGoal()
函数为变量i
分配堆栈存储,并且该存储只存在到isGoal()
返回的时间点
您看到i
,&i
的地址在您的程序中已经存在的原因是堆栈内存区域被不断重用。在gdb中看到的内容之前,您已经将堆栈变量的地址存储在节点->路径->下一个中
要获得在分配函数返回后仍然有效的内存,必须使用malloc()
和free()
来获得所谓的“动态内存”,或者有时从“堆”中获取内存。从堆栈中获取i
的内存,或者在C中有时称为“自动存储”
函数声明存储已返回后,从堆栈分配的内存内容不再有效。例如,您的isGoal()
函数为变量i
分配堆栈存储,并且该存储只存在到isGoal()
返回的时间点
您看到i
,&i
的地址在您的程序中已经存在的原因是堆栈内存区域被不断重用。在gdb中看到的内容之前,您已经将堆栈变量的地址存储在节点->路径->下一个中
要获取分配函数返回后仍然有效的内存,必须使用malloc()
和free()
来获取所谓的“动态内存”,或者有时从“堆”中获取内存。第一种可能性不大。你给出的第二个想法得到了他从gdb发布的数据的证实。他在数据结构中使用堆栈外的地址。您可以知道这一点,因为我显然在堆栈上。Thx,事实上,我创建了node->path outside作为一个本地变量,在我将其malloc之后,现在一切都好了。第一种可能性不大。你给出的第二个想法得到了他从gdb发布的数据的证实。他在数据结构中使用堆栈外的地址。你可以知道这一点,因为我显然在堆栈上。Thx,事实上,我创建了节点->外部路径作为一个本地变量,在我对其进行malloc之后,它现在就好了。Thx,事实上,我创建了节点->外部路径作为一个本地变量,在我对其进行malloc之后,它现在就好了。我看你是新来的。如果您接受我的回答,您可以单击复选框的大纲。这会将您的视图转换为填充的绿色复选框,表示您已接受我的答案。结果,你得几分,我得15分。另外,现在您已经调用了malloc(),假设您正在编写一个连续运行数周的程序。在这种情况下,在不再跟踪以前分配的内存时调用free()是至关重要的。例如,当您从路径列表中删除项时,您可能会释放()您的数据结构。Thx,事实上,我创建了node->path-outside作为一个本地变量,在我对其进行malloc之后,它就可以了。我看你是新来的。如果您接受我的回答,您可以单击复选框的大纲。这会将您的视图转换为填充的绿色复选框,表示您已接受我的答案。结果,你得几分,我得15分。另外,现在您已经调用了malloc(),假设您正在编写一个连续运行数周的程序。在这种情况下,在不再跟踪以前分配的内存时调用free()是至关重要的。例如,当从路径列表中删除项时,可以释放()数据结构。