malloc相邻内存块?

malloc相邻内存块?,c,memory,malloc,C,Memory,Malloc,我试图计算一个块中有多少字节被边界标记占用。我被告知,当尝试malloc相邻内存块时,汇编代码中会出现一个“跳转”,我可以用它来确定边界标记的大小。我试过这个: int* arr = malloc(8); arr++; arr = malloc(8); 但是在汇编代码中没有任何跳跃。我是否在“尝试malloc相邻的内存块” 编辑:我认为他的意思是地址值之间会出现跳转。我使用第二个内存块的开头减去第一个内存块的有效负载大小。但是我仍然很困惑,我怎么能malloc一个相邻的内存块呢?我只是看到一

我试图计算一个块中有多少字节被边界标记占用。我被告知,当尝试
malloc
相邻内存块时,汇编代码中会出现一个“跳转”,我可以用它来确定边界标记的大小。我试过这个:

int* arr = malloc(8);
arr++;
arr = malloc(8);
但是在汇编代码中没有任何跳跃。我是否在“尝试
malloc
相邻的内存块”



编辑:我认为他的意思是地址值之间会出现跳转。我使用第二个内存块的开头减去第一个内存块的有效负载大小。但是我仍然很困惑,我怎么能
malloc
一个相邻的内存块呢?

我只是看到一个内存泄漏。将Malloc 2次放入不同的变量8字节的空间中,然后查看差异是否超过8字节或2整数。

除非您正在编写一个实际的内存分配器,否则实际上无法分配两个连续的内存块。如果你想看到一些非常粗糙的代码,看看Illumos malloc


如果您想了解Illumos(和Solaris)如何处理分配的块之间的redzone,您应该浏览。

malloc(3)消耗的内存需要对实际使用的内存进行适当管理,一些结构也必须动态分配。出于这个原因,许多分配器只是分配了与专用于用户的块空间相邻的管理数据所需的空间。这使得通常由
malloc(2)
分配的两个连续的内存块在它们的地址中显示一些间隙

还有其他原因可以看出差距,一个基本原因是malloc通常会给您对齐的内存地址,因此保证您存储在该内存上的数据将正确对齐

当然,也可能存在这样的实现(通常当堆分配在缓冲区溢出方面应该更健壮时),即专用于存储管理数据的内存与最终给定的内存完全不相关且彼此分离。在这种情况下,您可以在某些情况下观察到内存分配之间没有间隙

无论如何,您的代码有严重的bug,让我们看看:

int* arr = malloc(8);
您最好在这里使用
sizeof
操作符获取所需的内存,如
int*arr=malloc(sizeof*arr)取而代之

arr++;
此语句是无用的,因为您将在
malloc()
之后使用新的赋值语句覆盖
arr
(指针)的值,因此增加指针值是没有用的。您还有些丢失了上一个
malloc()
的返回值(这对于返回分配的内存非常重要,但请阅读下文)

在此之前,您有机会
--arr
递减
arr
的值,以便能够
释放(3)
该块。但此语句覆盖存储在
arr
中的值,因此新指针将覆盖以前的指针值。您在第一个malloc上获得的内存无法再次访问。这就是通常所说的内存泄漏,在长时间运行的程序(如服务器或系统守护进程)上通常是一个严重错误(很难捕获)。程序在循环的内部分配一组内存,这些内存不会通过调用
free(3)
返回,因此程序开始不断增长,直到耗尽所有可用内存

最后一点,我不明白你说的malloc相邻内存块是什么意思。您是否相信递增指针会使
malloc()
产生一个特殊的内存块

  • 首先,malloc不知道您将如何处理它提供给您的指针
  • 但是,它也不知道您要分配给的指针的变量内容(您甚至不能将其存储在变量中,并将其作为另一个参数传递给另一个函数),因此malloc不可能知道您已从其主体中递增指针值,甚至递增指针位置

我猜不出你的解释。很高兴知道是什么让你认为你可以控制malloc(3)
如何选择给你的内存块。您无法控制
malloc()
的内部结构,您只需指定所需的连续内存量,mallocs就会提供它,并为您提供指向该块开头的指针。您不能假设下次调用malloc时(使用相同或不同的内存量),它会给您一个相邻的块。它可能与上一个给定的块完全不相关(内存中的上面或下面)。您不能修改该指针,因为一旦不再需要块,您需要它调用
free(3)
,而的指针值与
malloc(3)
给您的指针值完全相同。如果出于某种原因修改指针,则需要将其恢复为原始值,以便能够调用
free(3)
。如果不这样做,您可能会在下次调用
free(3)
时使程序崩溃

“跳转”可能是指“地址中的更改[跳转]”值?这个人提供的初始“提示”看起来有问题。不能保证两个连续的
malloc
调用会导致相邻的块。你所说的“跳入汇编代码”是什么意思?你能展示一下你是如何检查的吗?
arr++不跳转任何内容。它所做的只是将存储在
arr
中的内存地址提前
sizeof(int)
字节数。这不会告诉您有关已分配内存块的任何信息。您无法通过增加
malloc
返回的结果来更改它的功能<代码>arr++
后接
arr=malloc(8)arr = malloc(8);