一、步骤
1.1 打开ubuntu,编写ctest.c文件。
#include <stdio.h>
#include <stdlib.h>
int k1 = 1;
int k2;
static int k3 = 2;
static int k4;
int main( )
{ static int m1=2, m2;
int i = 1;
char *p;
char str[10] = "hello";
char *var1 = "123456";
char *var2 = "abcdef";
int *p1=malloc(4);
int *p2=malloc(4);
free(p1);
free(p2);
printf("栈区-变量地址\n");
printf(" i:%p\n", &i);
printf(" p:%p\n", &p);
printf(" str:%p\n", str);
printf("\n堆区-动态申请地址\n");
printf(" %p\n", p1);
printf(" %p\n", p2);
printf("\n.bss段\n");
printf("全局外部无初值 k2:%p\n", &k2);
printf("静态外部无初值 k4:%p\n", &k4);
printf("静态内部无初值 m2:%p\n", &m2);
printf("\n.data段\n");
printf("全局外部有初值 k1:%p\n", &k1);
printf("静态外部有初值 k3:%p\n", &k3);
printf("静态内部有初值 m1:%p\n", &m1);
printf("\n常量区\n");
printf("文字常量地址 :%p\n",var1);
printf("文字常量地址 :%p\n",var2);
printf("\n代码区\n");
printf("程序区地址 :%p\n",&main);
return 0;
}
1.2 编译后(以往实验操作不再赘述)结果如下。
二、结论
·静态分配内存是在程序编译和链接时就确定好的内存。
·动态分配内存是在程序加载、调入、执行的时候分配/回收的内存。
·栈的地址向下增长
·堆的地址向上增长
·静态变量地址向下增长
·全局常量地址向上增长
·函数地址向上增长
·函数一直到栈区,地址总体是从低地址到高地址逐步递增。
三、参考资料
1、C/C++程序内存的各种变量存储区域和各个区域详解
2、C语言中,局部变量、全局变量、静态变量、堆、栈的内存地址
3、C语言中关键字volatile追根问底