如何更改malloc.c标头的内容



在用户数据区开始之前,内存块中有一些使用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"单元格)。

相关内容

  • 没有找到相关文章