在用户数据区开始之前,内存块中有一些使用malloc分配的头内容。
buffer = (char*) (malloc (i));
int j;
for(j=1;j<9;j++){
printf("before data: %dn",*(buffer-j));
输出我得到的是数据之前:0数据之前:0数据之前:0数据之前:35数据之前:0数据之前:0数据之前:0数据前:0
我想在标题中有一个额外的字段,我将使用它来设置一些值。我尝试过修改malloc.c库来设置自定义头,但没有成功。我想知道我是否有办法做到这一点。
当您试图访问未分配的内存时,您的代码包含未定义的行为。在给定的平台上,内存分配器可能会将头放在分配的内存之前,但您不能依赖于此。
创建您自己的内存取消分配例程以在之前添加更多空间,如:
void *my_malloc(size_t s)
char *p = malloc(s+what_you_need);
if (p!=NULL) return (void *)(p+what_you_need);
return (void *)p;
}
void my_free(void *p) {
free(((char *)p)-what_you_need);
}
您也可以注意对齐要求。
如果你想替换malloc,你可以这么做。看看它是如何在tcmalloc和jemalloc中完成的,并在您自己的代码中完成。
在用户数据区开始之前,内存块中有一些使用malloc分配的头内容。
这是错误的,或者通常可能是错误的。
聪明的malloc
实现通常处理不同大小的不同块。有时,malloc
实现不使用malloc
-ed区域之前的字节。
实现malloc
的一种可能方式可能是保留几个不同的大块(例如,通过mmap(2)-兆字节大小的段),并处理不同的小分配和大分配,并将地址(相对于这些段的边界)与计算大小进行比较。
特别地,一些malloc
实现专门处理两个字单元的分配。他们可以(在他们的free
实现中)例如通过比较地址来确定区域的大小。例如,malloc
可以用(简单化的)假设进行编码,即形式为0x10yyyyy的所有地址(其中y
是任意十六进制数字)都是成对单词的堆分配。当然,在现实生活中,细节要复杂得多,但你已经明白了:计算堆分配区域的大小不必使用一些前缀数据,它可以用其他方法来完成。
一些malloc
实现确实处理了两个单词大小的单元格的malloc
(通常用于链表或Lisp"cons"单元格)。