C 链表-节点的内存地址

C 链表-节点的内存地址,c,memory-management,struct,linked-list,heap,C,Memory Management,Struct,Linked List,Heap,我制作了一个程序,它基于一个链表,链表中的节点通过指针链接在一起。每个节点都保存一个整数,该整数存储一个数字和指向下一个节点的指针。队列跟随FIFO 一切似乎都很完美!我可以向队列中添加新节点,也可以删除节点——所有这些都是以FIFO顺序进行的 该程序是关于动态内存分配的(使用malloc和free库函数) 那么,我的问题是什么?问题是内存是如何工作的,即当这些节点存储在堆上时-为什么这些节点以以下方式存储 1 (205888) 2 (206032) 3 (206888) 4 (2

我制作了一个程序,它基于一个链表,链表中的节点通过指针链接在一起。每个节点都保存一个整数,该整数存储一个数字和指向下一个节点的指针。队列跟随FIFO

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

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

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

 1 (205888)

 2 (206032)

 3 (206888)

 4 (206904)

 5 (215896)

 6 (215912)

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

因此,请查看节点5的地址,并将其与以前的节点进行比较—内存中似乎发生了一些事情—它在千个if字节中跳跃—从206904到215896

为什么这里跳得这么快?这意味着什么?这真的是内存泄漏吗?
或者是操作系统和编译器以这种方式组织内存分配???

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

只是一个小更新:


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

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