常量存在内存中的那里?

bengal1124 2013-07-06 10:31:40
const int n = 1; //全局的 这个 n 跟1 分别存在哪里?
char a = ‘0’ // 这个 a 跟‘0’ 分别存在哪里
char b[] = "hello" // 这个 b 跟“hello” 存在哪里?
...全文
1497 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-07-09
  • 打赏
  • 举报
回复
1 在 n 中,n 可能存在(有地址),也可能不存在,没有地址。 0 在 a 中 “Hello”在b中; 如果数组是全局变量,或者是静态变量,那么为数组赋值的常量只有一份,在数组中。 如果数组是自动变量,那么可能会有两份,一份在数据区,是无名全局变量,一份在函数内部,每次函数调用分配内存,并拷贝过来。 常量可能不占内存。 C,C++有所不同 因为C const 定义的也不是常量,只是不变的变量而已。 C++: const 定义的并用常量表达式初始化的简单类型,主要是包括bool ,char 类型在内的,各种内置整型 可以是常量,也可以是常量和变量的混合体, 比如 const int n = 5; int a[n];//这个地方,n当做数组的大小使用,数组大小,不占用内存 const int *p = &n; 这个n 是个常量,值为5,由于程序取了他的地址,所以他又有一个地址,用于存放5,他就是个常量和变量的混合体了。 而且对于这种情况,处理是比较复杂的,不同编译器处理结果可能是不同的。 浮点类型,更复杂。 另外 下面的for循环中,有两个常量 0,10 这种常量,通常会编译到代码中,通常是CPU的指令中,一般占用指令的操作数位置 常量 0 , 10 | | for (int i=0; i<10;i++) { ...... } const int M=11; int a; a = 10 ; 这个常量10 也可能会编译到代码中的,指令的操作数中。 a = M ;//这个M ,也就是11,也可能会编译到代码中的,指令的操作数中。 ///////////////////////////////////////////////////// //下面的程序里,有两个字符串常量--literal 或者翻译为字符串字面值---- //这两个字符串常量,都会安排到某种数据区(可能是常量区,或代码区) //这个函数只会使用他们的地址,把两个指针压栈即开始调用函数 printf 了。 //常量"%s" 和"Hello" // | | printf("%s","Hello");
赵4老师 2013-07-08
  • 打赏
  • 举报
回复
引用 14 楼 zshuaiqin 的回复:
Google一下你就明白了
引用 12 楼 zhao4zhong1 的回复:
数字常量占用代码段汇编指令的操作数部分。
google不到我这句话。
unituniverse2 2013-07-07
  • 打赏
  • 举报
回复
有个简单的方法判断是常量还是常变量,就是判断常量的使用者是否可以合法的取地址: 0.01是个常量而不是常变量,&0.01非法; const int a = 0;是个常变量,&a合法; enum nVal { id1 }; const nVal nval = id1; 中,id1就是个常量,&id1非法,而nval是个常变量,&nval合法。 &NULL非法,NULL就是个常量。
unituniverse2 2013-07-07
  • 打赏
  • 举报
回复
引用 5 楼 bengal1124 的回复:
[quote=引用 2 楼 unituniverse2 的回复:] ...
基本懂了 只剩最后一个问题 const修饰的变量存哪里呢[/quote] const修饰的变量就是常变量,原则上和普通变量的存储方式一致(也就是和没有const时的存储位置是一致的)。当代码中未出现对这个const变量取址、且这个常变量的类型为编译器内置类型时,有可能被优化成常数处理。但是记住这种优化只是编译器自己的优化手段,语义上还是有存储位置的。
bljswpu 2013-07-07
  • 打赏
  • 举报
回复
静态区 栈 堆 好好看看吧
艾薇儿More 2013-07-07
  • 打赏
  • 举报
回复
Google一下你就明白了
unituniverse2 2013-07-07
  • 打赏
  • 举报
回复
引用 10 楼 rosynirvana 的回复:
[quote=引用 2 楼 unituniverse2 的回复:] 字符串常量会放在一个专用的字符串池内存块中,或者放在静态数据区中。有些编译器还会安排在代码区一起(视所用的编译器和编译选项而定) 其他常量不占内存空间。 PS:注意别把常量和常变量搞混了。后者只不过拿const修饰了而已,本质上仍旧是变量。
lz的分类是C++问题,const修饰后在C++中是常量吧[/quote] 不是。只要能从外部取址都不是常量。
赵4老师 2013-07-07
  • 打赏
  • 举报
回复
数字常量占用代码段汇编指令的操作数部分。
rosynirvana 2013-07-07
  • 打赏
  • 举报
回复
引用 2 楼 unituniverse2 的回复:
字符串常量会放在一个专用的字符串池内存块中,或者放在静态数据区中。有些编译器还会安排在代码区一起(视所用的编译器和编译选项而定) 其他常量不占内存空间。 PS:注意别把常量和常变量搞混了。后者只不过拿const修饰了而已,本质上仍旧是变量。
lz的分类是C++问题,const修饰后在C++中是常量吧
unituniverse2 2013-07-06
  • 打赏
  • 举报
回复
字符串常量会放在一个专用的字符串池内存块中,或者放在静态数据区中。有些编译器还会安排在代码区一起(视所用的编译器和编译选项而定) 其他常量不占内存空间。 PS:注意别把常量和常变量搞混了。后者只不过拿const修饰了而已,本质上仍旧是变量。
橡木疙瘩 2013-07-06
  • 打赏
  • 举报
回复
对于整数类型,如果出现在表达式语句中,通常会成为“立即数”,被包含在生成的代码中。 没有参与代码生成的常量,比如用于全局变量的初始化、数组声明、模板参数等等,哪里也不存,在编译期就处理了。 其它常量,通常放在静态数据区。
xcaptain 2013-07-06
  • 打赏
  • 举报
回复
楼主可以看看《深入理解计算机系统》第七章链接,里面介绍了编译时变量存储到哪些地方。已初始化的全局变量存放在.data节中,未初始化的全局变量存放在.bss节中,然后连接的时候通过某种重定位算法把节中的变量定位到具体的内存中。既然你会用gdb那就更方便了,看看const int a的地址和全局变量的地址更接近还是和栈地址更接近。
bengal1124 2013-07-06
  • 打赏
  • 举报
回复
引用 5 楼 bengal1124 的回复:
[quote=引用 2 楼 unituniverse2 的回复:] 字符串常量会放在一个专用的字符串池内存块中,或者放在静态数据区中。有些编译器还会安排在代码区一起(视所用的编译器和编译选项而定) 其他常量不占内存空间。 PS:注意别把常量和常变量搞混了。后者只不过拿const修饰了而已,本质上仍旧是变量。
我在gcc编译器下 const int a 然后输出他的地址 发现 在栈区 这是为什么 还有就是我知道 全局变量 和静态变量 在静态存储区 那么 初始化的和未初始化的 全局变量 初始化 和未初始化的局部变量的 存储有什么区别么
bengal1124 2013-07-06
  • 打赏
  • 举报
回复
引用 2 楼 unituniverse2 的回复:
字符串常量会放在一个专用的字符串池内存块中,或者放在静态数据区中。有些编译器还会安排在代码区一起(视所用的编译器和编译选项而定) 其他常量不占内存空间。 PS:注意别把常量和常变量搞混了。后者只不过拿const修饰了而已,本质上仍旧是变量。
基本懂了 只剩最后一个问题 const修饰的变量存哪里呢
SKATE11 2013-07-06
  • 打赏
  • 举报
回复
引用 2 楼 unituniverse2 的回复:
字符串常量会放在一个专用的字符串池内存块中,或者放在静态数据区中。有些编译器还会安排在代码区一起(视所用的编译器和编译选项而定) 其他常量不占内存空间。 PS:注意别把常量和常变量搞混了。后者只不过拿const修饰了而已,本质上仍旧是变量。
++

65,176

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧