C语言中全局与局部变量const初始化器的差异问题咨询
全局与局部作用域指针初始化差异的原因分析
这是C语言对不同作用域变量初始化规则的差异导致的:
全局变量的初始化规则
全局变量存放在静态存储区,其初始化必须在编译阶段完成,因此初始化表达式必须是编译期可确定的常量表达式。
代码里const int* p1 = &g_value合法,因为&g_value是编译时就能确定的全局变量地址,属于常量表达式;但const int* p2 = p1中,p1是一个全局指针变量,它的值是程序加载时才确定的(本质是变量而非编译期常量),用它初始化另一个全局变量不符合规则,因此编译器报错。局部变量的初始化规则
局部变量存放在栈区,其初始化是在程序运行到代码块时执行的,属于运行期初始化。此时p3已经是一个有效的指针变量,拥有确定的内存地址值,用它来初始化p4是合法的运行时赋值操作,编译器不会限制这种行为,因此可以正常编译。
内容的提问来源于stack exchange,提问作者Perlman Soong
相关产品推荐
相关产品推荐

