我目前正在学习如何通过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);
}
结果就是:
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
的内部簿记数据。如果您在内存访问验证器(如valgrind
ASan)下运行程序,它将崩溃。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句