变量存放的内存五大区
栈区:
用于存储局部变量,其存放数据结构和数据结构中的栈相同。
堆区:
用于存放自助申请的空间,如malloc/new,其存放数据结构类似于链表
全局静态区:
用于存放静态变量和全局变量,分为DATA段和BSS段,其中DATA段存放已经被初始化的静态变量或全局变量;BSS段存放还未被初始化的全局或静态变量。
注意,BSS段中的初始化只会执行一次,在程序执行之前会全部赋值0。而已初始化的变量则是在程序执行之前先放入DATA段中。
文字常量区:
存放不能修改的常量。
代码区(也有说是自由存储区):
存放代码。其中需要注意加了static 修饰的函数仍然是在代码区。
#include <stdlib.h>
#include <stdio.h>
char x1 = 1;//全局区 DATA段
char x2 = 2;
int y1;//全局区 BSS段
int y2;
static int x3 = 3; //全局区 Data段
static int x4 = 4;
static int y3;//全局区 BSS段
static int y4;
void f() {
}
int main() {
printf("================栈区========================\n");
int a;
char b = 'a';
char c[10] = "asdf";
int *p = &a;
printf("a在栈区:%p\n", &a);
printf("b在栈区:%p\n", &b);
printf("c在栈区:%p\n", &c);
printf("p在栈区:%p\n", &p);
printf("================堆区========================\n");
int *q1 = (int*)malloc(sizeof(int));
int *q2 = (int*)malloc(sizeof(int));
printf("q1在堆区:%p\n", q1);
printf("q2在堆区:%p\n", q2);
free(q1), free(q2);
printf("================全局区========================\n");
printf("x1在全局区 DATA段:%p\n", &x1);
printf("x2在全局区 DATA段:%p\n", &x2);
printf("y1在全局区 BSS段:%p\n", &y1);
printf("y2在全局区 BSS段:%p\n", &y2);
printf("用static修饰之后\n");
printf("x3在全局区 DATA段:%p\n", &x3);
printf("x4在全局区 DATA段:%p\n", &x4);
printf("y3在全局区 BSS段:%p\n", &y3);
printf("y4在全局区 BSS段:%p\n", &y4);
printf("================文字常量区========================\n");
const char *s1 = "asdfsfsda";
const char *s2 = "fsd";
printf("s1在文字常量区:%p\n", s1);
printf("s2在文字常量区:%p\n", s2);
printf("================程序区========================\n");
printf("main函数放在程序区:%p\n", &main);
printf("f函数放在程序区:%p\n", &f);
return 0;
}