C语言——全局变量和局部变量在内存中的区别——及编译后的内存分区【栈-堆-全局存储区-文字常量区-程序代码区】

 目录:

一:全局变量

二:局部变量

三:C语言经过编译之后将内存分为以下几个区域

(1)栈(stack)

(2)堆(heap)

(3)全局(静态)存储区

(4)文字常量区

(5)程序代码区

四:区别 

1. 全局变量

2.局部变量


一:全局变量

全局变量保存内存的全局存储区中占用静态的存储单元

二:局部变量

局部变量保存栈中只有在所在函数被调用动态地为变量分配存储单元

三: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 这是一个定义,不是声明。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘鑫磊up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值