C语言有 全局变量(Global)、本地变量(Local)、静态变量(Static)和寄存器变量(Register)。
每种变量都有不同的分配方式。
#include<stdio.h>
int g1 = 0, g2 = 0, g3 = 0;
int main()
{
static int s1 = 0, s2 = 0, s3 = 0;
int v1 = 0, v2 = 0, v3 = 0;
printf("&g1 = 0x08%X \n", &g1);
printf("&g2 = 0x08%X \n", &g2);
printf("&g3 = 0x08%X \n\n", &g3);
printf("&s1 = 0x08%X \n", &s1);
printf("&s2 = 0x08%X \n", &s2);
printf("&s3 = 0x08%X \n\n", &s3);
printf("&v1 = 0x08%X \n", &v1);
printf("&v2 = 0x08%X \n", &v2);
printf("&v3 = 0x08%X \n\n", &v3);
}
执行结果:
&g1 = 0x088CA138
&g2 = 0x088CA13C
&g3 = 0x088CA140
&s1 = 0x088CA144
&s2 = 0x088CA148
&s3 = 0x088CA14C
&v1 = 0x08EFFA28
&v2 = 0x08EFFA1C
&v3 = 0x08EFFA10
输出的结果就是变量的内存地址。其中
v1、v2、v3 是 本地变量,
g1、g2、g3 是 全局变量,
s1、s2、s3 是 静态变量。
可以看到这些变量在内存中是连续分布的,但是本地变量和全局变量分配的内存地址差了十万八千里,而 全局变量
和静态变量
分配的内存是连续的。这是因为 本地变量 和 全局/静态变量
是分配在不同类型的内存区域中的结果。
对于一个进程的内存空间而言,可以在逻辑上分成3个部分:代码区、静态数据区和动态数据区。动态数据区一般就是“堆栈”。“栈(stack)”和“堆(heap)”是两种不同的动态数据区。
栈
是一种线性结构
,堆
是一种链式结构
。
进程的每个线程都有私有的“栈”,所以每个线程虽然代码一样,但本地变量的数据都是互不干扰的。
一个堆栈 可以通过 基地址
和 栈顶
地址来描述。全局变量
和静态变量
分配在 静态数据区
,本地变量
分配在 动态数据区
,即堆栈中。