【发布时间】:2011-03-27 17:54:58
【问题描述】:
我认为我无法像 Java 中的简单 .length 函数那样检索已分配内存块的长度。但是,我现在知道当malloc() 分配块时,它会分配额外的字节来保存包含块大小的整数。该整数位于块的开头;实际返回给调用者的地址指向刚刚超过这个长度值的位置。问题是,我无法访问该地址来检索块长度。
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
char *str;
str = (char*) malloc(sizeof(char)*1000);
int *length;
length = str-4; /*because on 32 bit system, an int is 4 bytes long*/
printf("Length of str:%d\n", *length);
free(str);
}
**编辑: 我终于做到了。问题是,它一直给出 0 作为长度而不是我系统上的大小,因为我的 Ubuntu 是 64 位的。我将 str-4 更改为 str-8,现在可以使用了。
如果我将大小更改为 2000,它会生成 2017 作为长度。但是,当我更改为 3000 时,它会给出 3009。我使用的是 GCC。
【问题讨论】:
-
您所描述的完全取决于特定的 malloc 实现以您描述的方式存储信息。 malloc 的实现不一定必须跟踪分配了多少内存(不太可能,但有可能,因为 API 不要求将此信息公开给调用者。)
-
@Joe:例如,您可以相当容易地实现基于池的分配器,例如,所有大小为 1-8 的分配来自一个池,9-16 来自另一个池,17-32从另一个,等等。然后,每个分配可能会存储一个指向其池的指针,而不是存储在可用内存之前的大小。不过,大分配必须区别对待。