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()是至关重要的。例如,当从路径列表中删除项时,可以释放()数据结构。