我目前正在学习如何通过 malloc 和 free 管理内存,我不明白为什么当我想要 malloc 1 个字节时,malloc 会为该块分配 32 个字节?对我来说,它应该为元数据分配 16 个字节(前一个块和下一个块的大小),为数据分配 1 个字节......
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
/**
* pmem - print mem
* @p: memory address to start printing from
* @bytes: number of bytes to print
*
* Return: nothing
*/
void pmem(void *p, unsigned int bytes)
{
unsigned char *ptr;
unsigned int i;
ptr = (unsigned char *)p;
for (i = 0; i < bytes; i++)
{
if (i != 0)
{
printf(" ");
}
printf("%02x", *(ptr + i));
}
printf("\n");
}
/**
* main - moving the program break
*
* Return: EXIT_FAILURE if something failed. Otherwise EXIT_SUCCESS
*/
int main(void)
{
void *p;
size_t size_of_the_chunk;
char prev_used;
p = malloc(1);
printf("%p\n", p);
pmem((char *)p - 0x10, 0x10);
size_of_the_chunk = *((size_t *)((char *)p - 8));
prev_used = size_of_the_chunk & 1;
size_of_the_chunk -= prev_used;
printf("chunk size = %li bytes\n", size_of_the_chunk);
return (EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)
这就是结果:
0x13bf010
00 00 00 00 00 00 00 00 21 00 00 00 00 00 00 00
块大小 = 32 字节
malloc需要返回足够对齐的指针来存储任何类型的数据,甚至是无法放入分配的空间的数据类型。这意味着,如果_Alignof(max_align_t) == 32在您的系统上,malloc(1)则必须仅返回 32 倍数的指针,即使您要求的空间小于该值。实现此目的的一个简单方法是将其内部簿记数据中的每个分配四舍五入为 32 的倍数,这似乎就是您正在查看的内容。
然而,C 标准明确禁止您访问内存,即使是超出您所要求的空间量末尾的单个字节。它还特别禁止您访问 的malloc内部簿记数据。如果您在内存访问验证器(例如 ASan 或 ASan)下运行程序,valgrind它将崩溃。