【发布时间】:2012-01-12 20:11:45
【问题描述】:
正如我们所知,free() 函数通过使用存储在 malloc 指针后面的前缀整数值知道要从 malloc 内存中释放多少内存。所以我尝试了这段代码,有两个疑问:
如果我
malloc()20 个字节,然后在递减的指针处打印整数值,则显示为 25 个字节。如果我malloc()40 个字节,然后打印该值,那么我得到 49 个字节!如果我尝试超越并在我的 malloc'd 空间之后打印值,每次我得到一个大整数值存储在 malloc'd 内存的最后一个旁边。那价值是什么?有什么特别的吗?
任何解释都将不胜感激。
int main()
{
int i;
int *ptr, *pr;
ptr = (int *)malloc(20);
pr = ptr;
printf("value of ptr is %p", ptr);
for(i = 0; i < 5; i++) {
ptr[i] = i + 1;
}
printf("now the values in malloc'd memory is\n");
for(i = 0; i < 5; i++) {
printf("%d\n", ptr[i]);
}
printf("value of ptr is %p\n", ptr);
pr--;
for(i = 0; i < 20; i++) {
printf("value of pr at address %p is %d\n", pr, *pr);
pr++;
}
return 0;
}
【问题讨论】:
-
不,我们不知道。
-
扩展 Kerrek SB 所说的内容,是什么让您认为这就是您的
malloc实现跟踪大小的方式? -
您是否仅出于学术原因使用它? C 或 C++ 中没有任何规则可以保证您所说的内容。
-
@kerrek SB,@aix,@Renan Greinert 请原谅这个错误,我只是一个初学者,我说的是我从书本或互联网上读到的……这是一种方法吗了解 free() 是如何实现的?如果是的话,那么你们可以请人吗?看看我的疑问..
-
我希望之前的值实际上表示大小为 24 或 48,最低位用作标志以表示某事或其他(可能是分配了内存)。您看到的“大值”可能是未初始化的内存,或者是内存分配器数据结构中其他位置的指针。 Kerrek 是正确的,实际上我们不知道细节,但原则上我们可以检查 glibc 中
malloc的实现。您应该这样做,查看代码(和 cmets)比浏览数据更有启发性。