70,037
社区成员
发帖
与我相关
我的任务
分享
问题、判断一个地址是否位于堆中(C实现)
//《摘自More Effective C++》Item 27
// 解决方案基于这样一个事实:程序的地址空间被做为线性地址管理,程序的栈从地
// 址空间的顶部向下扩展,堆则从底部向上扩展。
//
// 在IsOnHeap函数中onTheSatck是一个局部变量,因此它在堆栈上。当调用IsOnHeap时,
// 它的栈框架(也就是它的activation record)被放在程序栈的顶端,因为栈在结构上是向下
// 扩展的(趋向低地址),onTheStack的地址肯定比任何栈中的变量或对象的地址小。
// 如果参数address的地址小于onTheStack的地址,它就不会在栈上,而是肯定在堆上。
// 在这里不考虑静态变量或其他类型变量
#include <stdio.h>
#include <malloc.h>
int IsOnHeap(const void* address)
{
char onTheStack;
printf("%x %x\n", address, &onTheStack);
return address < &onTheStack;
}
int main()
{
int* pp = (int *) malloc(sizeof(int));
printf("%d\n", IsOnHeap(pp));
int i, ii;
printf("%x %x\n", &i, &ii);
free(pp);
return 0;
}
// 在VS2008下编译,结果是
// 393720 12fe67 0 12ff54 12ff48
// 1、结果显示pp不在堆中,这与预想不同,为什么?
// 2、i 与 ii 的存储位置为何相差12个字节?(结构成员对齐为4字节,Debug模式)