A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 那个Mr_Z 中级黑马   /  2014-4-3 20:25  /  1254 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

C语言编译规定了全局变量,静态数组,静态变量,const变量在内存的存放了么?如果有,具体对应分别是堆?栈?数据段?如果没有,请问大部分编译器如何处理,特别是对const  a=5;  int *p=&a;的处理?   

3 个回复

正序浏览
本帖最后由 魅影穿眸 于 2014-4-25 13:55 编辑

.局部const,并不是在常量区分配的,编译器会将const优化,类似于宏定义,出现const变量的地方在编译时就已经替换其值了。所以其实根本没有分配丝毫空间。(只有当你取变量的地址时,才会在栈上分配空间,但是这个分配的空间其实没有什么意义的,因为所有取const变量值的地方,编译时就已经替换成初值了)对于全局的const变量,是在常量区分配内存的,是真正的常量。内存是运行时(运行初期)分配的,但分配内存的大小编译时就决定了。“只读数据段”的内存,运行完才释放。
这两个问题的解答:
const int a=5;其实类似于宏定义#define a 5,编译时就将局部函数内的a替换成了5。

int *p=&a;他只是取了常量a的地址而已。
回复 使用道具 举报
为啥现在提问的问题都没有技术分了-0-
回复 使用道具 举报
1.局部const,并不是在常量区分配的,编译器会将const优化,类似于宏定义,出现const变量的地方在编译时就已经替换其值了。所以其实根本没有分配丝毫空间。(只有当你取变量的地址时,才会在栈上分配空间,但是这个分配的空间其实没有什么意义的,因为所有取const变量值的地方,编译时就已经替换成初值了)

2.内存是运行时(运行初期)分配的,但分配内存的大小编译时就决定了。“只读数据段”的内存,运行完才释放。

3.const int a=1;其实类似于宏定义#define a 1,编译时就将局部函数内的a替换成了1。

4.对于全局的const变量,是在常量区分配内存的,是真正的常量。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马