目录:
一:全局变量
全局变量保存在内存的全局存储区中,占用静态的存储单元
二:局部变量
局部变量保存在栈中,只有在所在函数被调用时才动态地为变量分配存储单元
三:C语言经过编译之后将内存分为以下几个区域
(1)栈(stack)
由编译器进行管理
自动分配和释放
存放函数调用过程中的各种参数、局部变量、返回值以及函数返回地址
操作方式类似数据结构中的栈【类似】
(2)堆(heap)
用于程序动态申请分配和释放空间
C语言中的malloc和free,C++中的new和delete均是在堆中进行的
正常情况下,程序员申请的空间在使用结束后应该释放
若程序员没有释放空间,则程序结束时系统自动回收
注意:这里的“堆”并不是数据结构中的“堆”。【不类似】
(3)全局(静态)存储区
分为DATA段和BSS段:
DATA段(全局初始化区)存放初始化的全局变量和静态变量
BSS段(全局未初始化区)存放未初始化的全局变量和静态变量
程序运行结束时自动释放
其中BBS段在程序执行之前会被系统自动清0
所以未初始化的全局变量和静态变量在程序执行之前已经为0
(4)文字常量区
存放常量字符串。程序结束后由系统释放。
(5)程序代码区
存放程序的二进制代码
四:区别
显然,C语言中的全局变量和局部变量在内存中是有区别的
1. 全局变量
C语言中的全局变量包括外部变量和静态变量
均是保存在全局存储区中
占用永久性的存储单元
2.局部变量
局部变量,即自动变量
保存在栈中
只有在所在函数被调用时才由系统动态在栈中分配临时性的存储单元
有兴趣的读者可以运行下面的程序,分析一下运行结果:
#include <stdio.h>
#include <stdlib.h>
int k1 = 1;
int k2;
static int k3 = 2;
static int k4;
int main( )
{ staticint m1=2, m2;
inti=1;
char*p;
charstr[10] = "hello";
char*q = "hello";
p= (char *)malloc( 100 );
free(p);
printf("栈区-变量地址 i:%p\n", &i);
printf(" p:%p\n", &p);
printf(" str:%p\n", str);
printf(" q:%p\n", &q);
printf("堆区地址-动态申请:%p\n", p);
printf("全局外部有初值 k1:%p\n", &k1);
printf(" 外部无初值 k2:%p\n", &k2);
printf("静态外部有初值 k3:%p\n", &k3);
printf(" 外静无初值 k4:%p\n", &k4);
printf(" 内静态有初值 m1:%p\n", &m1);
printf(" 内静态无初值 m2:%p\n", &m2);
printf("文字常量地址 :%p, %s\n",q, q);
printf("程序区地址 :%p\n",&main);
return0;
}
extern int a; // 声明一个全局变量 a
int a; // 定义一个全局变量 a
extern int a =0; // 定义一个全局变量 a 并给初值。一旦给予赋值,一定是定义,定义才会分配存储空间
int a =0; //定义一个全局变量 a,并给初值
声明之后你不能直接使用这个变量,需要定义之后才能使用。
第四个等于第三个,都是定义一个可以被外部使用的全局变量,并给初值。
糊涂了吧,他们看上去可真像。但是定义只能出现在一处。也就是说,不管是 int a 还是 int a=0 都只能出现一次,而那个 extern int a 可以出现很多次。
当你要引用一个全局变量的时候,你就要声明 extern int a 这时候 extern 不能省略,因为省略了,就变成 int a 这是一个定义,不是声明。