我制作了一个程序,该程序基于带有节点的链表,这些节点用指针链接在一起。每个节点都包含一个整数,用于存储数字和指向下一个节点的指针。队列遵循FIFO。
似乎一切都很完美!我可以将新节点添加到队列中,我可以删除节点 - 所有这些都按FIFO顺序排列。
该程序是关于动态内存分配(使用malloc和免费库函数)
那么我的问题是什么呢?问题是内存是如何工作的,即当这些节点存储在堆上时 - 为什么节点以下列方式存储。
1 (205888)
2 (206032)
3 (206888)
4 (206904)
5 (215896)
6 (215912)
7 (215928)
这是程序的输出。第一个是存储的整数,而括号是节点的地址。
所以 - 看一下节点5的地址并将它与之前的节点进行比较 - 似乎在内存中发生了一些事情 - 如果是字节的话,从206904到215896就会有一个跳跃。
为什么这么跳?它有什么含义?这真的是内存泄漏吗? 或者以这种方式操作系统和编译器组织内存分配???
答案 0 :(得分:2)
我假设您在需要创建新节点时使用malloc来分配内存。在较高的层次上,malloc只为您提供一块内存,可以容纳您要求的数据大小。因为它只是找到了可用的内存块,所以不保证在不同的调用中返回的内存位置malloc不会保证彼此靠近。
只是一个小小的更新:
我的观点是,只要你释放内存并且不留下/丢失指针,你就没事了。内存位置的跳跃并不值得担心。这对于内存分配来说是正常的,并且它们并不表示您的程序出现任何问题。
答案 1 :(得分:0)
一切都很好......没有任何东西可以使新块在前一个块附近获得一个位置或地址。我们所知道的是前一个节点包含第一个节点的地址。动态内存分配不具有传染性。例如,malloc函数将从堆中请求一块内存。如果请求被授予,操作系统将保留所请求的内存量。 但是,如果您使用过数组,那么地址就像您预期的一样。