黑马程序员技术交流社区

标题: 如何用C语言为静态栈开辟空间 [打印本页]

作者: 那个Mr_Z    时间: 2014-4-3 20:25
标题: 如何用C语言为静态栈开辟空间
C语言编译规定了全局变量,静态数组,静态变量,const变量在内存的存放了么?如果有,具体对应分别是堆?栈?数据段?如果没有,请问大部分编译器如何处理,特别是对const  a=5;  int *p=&a;的处理?   
作者: 2014571245    时间: 2014-4-3 20:44
1.局部const,并不是在常量区分配的,编译器会将const优化,类似于宏定义,出现const变量的地方在编译时就已经替换其值了。所以其实根本没有分配丝毫空间。(只有当你取变量的地址时,才会在栈上分配空间,但是这个分配的空间其实没有什么意义的,因为所有取const变量值的地方,编译时就已经替换成初值了)

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

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

4.对于全局的const变量,是在常量区分配内存的,是真正的常量。
作者: 那个Mr_Z    时间: 2014-4-4 14:11
为啥现在提问的问题都没有技术分了-0-
作者: 魅影穿眸    时间: 2014-4-25 13:52
本帖最后由 魅影穿眸 于 2014-4-25 13:55 编辑

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

int *p=&a;他只是取了常量a的地址而已。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2