【问题标题】:Linked list - memory address of nodes链表——节点的内存地址
【发布时间】:2013-12-09 10:32:32
【问题描述】:

我制作了一个基于带有节点的链表的程序,该链表通过指针链接在一起。每个节点都保存一个整数,该整数存储一个数字和一个指向下一个节点的指针。队列遵循先进先出。

一切似乎都很完美!我可以将新节点添加到队列中,也可以删除节点——所有这些都按 FIFO 顺序进行。

该程序是关于动态内存分配的(使用 malloc 和 free 库函数)

那么我的问题是什么?问题是内存是如何工作的,即当这些节点存储在堆上时 - 为什么节点以以下方式存储。

 1 (205888)

 2 (206032)

 3 (206888)

 4 (206904)

 5 (215896)

 6 (215912)

 7 (215928) 

这是程序的输出。第一个是存储的整数,括号是节点的地址。

所以 - 查看节点 5 的地址并将其与早期节点进行比较 - 内存中似乎发生了一些事情 - 如果字节数增加了千字节 - 从 206904 到 215896。

为什么会出现这样的跳跃?它有什么含义?真的会是内存泄漏吗? 还是以这种方式操作系统和编译器组织内存分配???

【问题讨论】:

    标签: c struct memory-management linked-list heap-memory


    【解决方案1】:

    我假设您在需要创建新节点时使用 malloc 分配内存。在高层次上,malloc 只是为您提供一块内存,可以容纳您要求的数据大小。由于它只是找到任何可用的内存块,因此不能保证 malloc 在不同调用中返回的内存位置彼此靠近。

    只是一个小更新:

    我的意思是,只要你释放内存并且不留下/丢失指针,你会没事的。内存位置的跳跃无需担心。这对于内存分配来说是正常的,它们并不表示您的程序有任何问题。

    【讨论】:

      【解决方案2】:

      一切都很好......新块将在前一个附近获得一个位置或地址。我们所知道的是,前一个节点包含第一个节点的地址。动态内存分配不会传染。例如 malloc 函数将从堆中请求一块内存。如果请求被批准,操作系统将保留请求的内存量。 但是,如果您使用数组,则地址将符合您的预期。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多