链表 - 节点的内存地址

时间:2013-11-24 20:24:50

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

我制作了一个程序,该程序基于带有节点的链表,这些节点用指针链接在一起。每个节点都包含一个整数,用于存储数字和指向下一个节点的指针。队列遵循FIFO。

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

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

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

 1 (205888)

 2 (206032)

 3 (206888)

 4 (206904)

 5 (215896)

 6 (215912)

 7 (215928) 

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

所以 - 看一下节点5的地址并将它与之前的节点进行比较 - 似乎在内存中发生了一些事情 - 如果是字节的话,从206904到215896就会有一个跳跃。

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

2 个答案:

答案 0 :(得分:2)

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

只是一个小小的更新:

我的观点是,只要你释放内存并且不留下/丢失指针,你就没事了。内存位置的跳跃并不值得担心。这对于内存分配来说是正常的,并且它们并不表示您的程序出现任何问题。

答案 1 :(得分:0)

一切都很好......没有任何东西可以使新块在前一个块附近获得一个位置或地址。我们所知道的是前一个节点包含第一个节点的地址。动态内存分配不具有传染性。例如,malloc函数将从堆中请求一块内存。如果请求被授予,操作系统将保留所请求的内存量。 但是,如果您使用过数组,那么地址就像您预期的一样。