作者:书友67696238 | 来源:互联网 | 2023-10-11 13:50
文章目录变量、函数的属性内存区域1栈stackconst修饰的变量const修饰的指针2堆heap3全局(静态)变量区4常量区5代码段内存区域图解堆、栈和内存区域映射图解变量、函数
文章目录
- 变量、函数的属性
- 内存区域
- 1 栈stack
- 2 堆heap
- 3 全局(静态)变量区
- 4 常量区
- 5 代码段
- 内存区域图解
- 堆、栈和内存区域映射图解
变量、函数的属性
内存区域
1 栈stack
- (默认1M,大小可修改)内存1024*512,系统自主管理
栈顶位于低地址,栈底位于高地址,即所谓的向下生长。
连续分配内存,先进后出。
数组和字符串在栈中按整体储存,此时尾部位于高地址。
如,数组{1,2,3,4,5}
在栈中从上(栈底)往下(栈顶)按5,4,3,2,1排列,
即:其尾部5位于高地址,头部1位于低地址
int arr = { 1,2,3,4,5 };
int* p = arr;
int a = 100;
char str[] = "hello";
char* p = str;
栈底位于高地址,向下生长
a 先进栈,位于栈底,地址最高
然后是字符串的’\0’ ~ ‘h’,地址依次降低。
const修饰的变量
- 其值位于栈中,是重新分配的内存
- 链接属性:内部的,无法使用extern强制引用
char p[] = "blue";
const char p1[] = "blue";
const char p2[] = "blue";printf("%p %p %p\n", &p,&p1,&p2);
const修饰的指针
- 其指向的数据是位于常量区的,内存地址不发生改变
const char* p3 = "blue";
const char* p4 = "blue";printf("%p %p\n", p3,p4);
2 堆heap
- 内存几乎接近物理内存,外部自行管理,
malloc()创建的动态内存位于该区域
堆顶位于高地址,堆底位于低地址,即所谓的向上生长。
3 全局(静态)变量区
- 包含所有静态变量(静态全局变量,静态局部变量)和全局变量
全局变量:函数外部定义的变量
局部变量:函数内部定义的变量
4 常量区
- 包含字符常量,数字常量,const全局变量
5 代码段
内存区域图解
堆、栈和内存区域映射图解
int* stack = (int*)malloc(4 * sizeof(int));
int top = 0;
stack[top++] = 0;
stack[top++] = 1;
stack[top++] = 2;
stack[top++] = 3;
int a = stack[--top];
int b = stack[--top];
int c = stack[--top];
int d = stack[--top];
注意堆内存空间的大小,避免溢出!!