
#
include
<stdio.h>
int g1=0, g2=0, g3=0;
intmax(int i)
{
????int m1=0,m2,m3=0,*p_max;
????static n1_max=0,n2_max,n3_max=0;
????p_max =(int*)malloc(10);
????printf("打印max程序地址\n");
????printf("in max: 0x%08x\n\n",max);
????printf("打印max傳入?yún)?shù)地址\n");
????printf("in max: 0x%08x\n\n",&i);
????printf("打印max函數(shù)中靜態(tài)變量地址\n");
????printf("0x%08x\n",&n1_max);//打印各本地變量的內(nèi)存地址
????printf("0x%08x\n",&n2_max);
????printf("0x%08x\n\n",&n3_max);
????printf("打印max函數(shù)中局部變量地址\n");
????printf("0x%08x\n",&m1);//打印各本地變量的內(nèi)存地址
????printf("0x%08x\n",&m2);
????printf("0x%08x\n\n",&m3);
????printf("打印max函數(shù)中malloc分配地址\n");
????printf("0x%08x\n\n",p_max);//打印各本地變量的內(nèi)存地址
????if(i)return 1;
????elsereturn 0;
}
int main(int argc,char**argv)
{
staticint s1=0, s2, s3=0;
int v1=0, v2, v3=0;
int*p;????
p =(int*)malloc(10);
printf("打印各全局變量(已初始化)的內(nèi)存地址\n");
printf("0x%08x\n",&g1);//打印各全局變量的內(nèi)存地址
printf("0x%08x\n",&g2);
printf("0x%08x\n\n",&g3);
printf("======================\n");
printf("打印程序初始程序main地址\n");
printf("main: 0x%08x\n\n", main);
printf("打印主參地址\n");
printf("argv: 0x%08x\n\n",argv);
printf("打印各靜態(tài)變量的內(nèi)存地址\n");
printf("0x%08x\n",&s1);//打印各靜態(tài)變量的內(nèi)存地址
printf("0x%08x\n",&s2);
printf("0x%08x\n\n",&s3);
printf("打印各局部變量的內(nèi)存地址\n");
printf("0x%08x\n",&v1);//打印各本地變量的內(nèi)存地址
printf("0x%08x\n",&v2);
printf("0x%08x\n\n",&v3);
printf("打印malloc分配的堆地址\n");
printf("malloc: 0x%08x\n\n",p);
printf("======================\n");
????max(v1);
printf("======================\n");
printf("打印子函數(shù)起始地址\n");
printf("max: 0x%08x\n\n",max);
return 0;
}
?
這個程序可以大致查看整個程序在內(nèi)存中的分配情況:
可以看出,傳入的參數(shù),局部變量,都是在棧頂分布,隨著子函數(shù)的增多而向下增長.
函數(shù)的調(diào)用地址(函數(shù)運行代碼),全局變量,靜態(tài)變量都是在分配內(nèi)存的低部存在,而malloc分配的堆則存在于這些內(nèi)存之上,并向上生長
大盤預(yù)測 國富論