const、static变量存放位置

本文详细解析了C++中不同类型的变量(如const、static等)在内存中的存储位置及作用域,包括它们在全局/静态区域、只读数据段、栈中的存放规则,并通过示例代码验证了const变量的具体位置。

我们将以下面的例子介绍const变量和static变量的存放位置:

static int  val_a = 1 ; // 初始化的静态变量 

int  val_b = 2 ;        // 全局变量 

const int  val_c = 3 ;  // const 全局变量 

static int  val_d ;     // 未初始化的静态变量 

int  val_e ;            // 未初始化的全局变量

int main()

{

    static int val_f = 5;  // 初始化的局部静态变量

    static int val_g;      //未初始化局部静态变量

    int    val_h = 6;      //初始化局部变量

    int    val_i;          //未初始化局部变量

    const  int val_j = 7;  //const局部变量

    return 0;

}

①static无论是全局变量还是局部变量都存储在全局/静态区域,在编译期就为其分配内存,在程序结束时释放,例如:val_a、val_d、val_h、val_i。

②const全局变量存储在只读数据段,编译期最初将其保存在符号表中,第一次使用时为其分配内存,在程序结束时释放,例如:val_c;const局部变量存储在栈中,代码块结束时释放,例如:val_j。

③全局变量存储在全局/静态区域,在编译期为其分配内存,在程序结束时释放,例如:val_b、val_e。

④局部变量存储在中,代码块结束时释放,例如:val_h、val_i。

注:当全局变量和静态局部变量未赋初值时,系统自动置为0。

代码分析:const修饰变量,对其作用域没有影响。

如下程序所示,在main函数中定义三个变量,其中,a、b保存在栈中,这一点毫无疑问。通过打印三个变量的地址值,查看const修改的b变量的地址是否处于a和c之间。

#include <stdio.h>

int main()
{
    int a;
    const int b=20;
    int c=90;

    printf("a:%#x\n",&a);
    printf("b:%#x\n",&b);
    printf("c:%#x\n",&c);

    return 0;
}

173253_HWPM_2888084.png

通过打印地址值可以知道,const修饰的变量b也应该位于栈中。因为三个变量的地址是连续的。

结论:也就是说,const修饰变量,不会改变变量的作用域。

转载于:https://my.oschina.net/cht2000/blog/1673081

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值