C语言中常量是否拥有内存地址的技术咨询
关于C语言中常量内存地址的答疑
嘿,这个问题问到点子上了——C语言里常量的内存存储确实容易搞混,结合你给的代码例子,我给你拆解清楚:
一、数值常量300的情况
首先得明确:数值常量本身在C标准里是不允许直接取地址的,但它的存储分两种场景:
- 一种是编译器把它作为「立即数」直接编码到指令里,比如
int var = 300;这条指令可能会被编译成把300直接写入var的内存位置,这时候300是指令的一部分,它没有独立的内存地址(或者说你没法通过合法的C代码获取它的地址)。 - 另一种是编译器把常用的数值常量放到程序的常量区(比如
.rodata段),但即便如此,你也不能用&300这种写法去取它的地址——编译器会直接报错,因为C标准不允许对数值常量取地址操作。
举个反例,如果你写:
int *ptr = &300; // 编译错误:lvalue required as unary '&' operand
这肯定过不了编译,就说明你没法合法获取这个数值常量的独立地址。
二、字符串常量"Clang"与"Wonder"的情况
这俩就不一样了——所有字符串常量在程序运行时都是有独立内存地址的!
咱们结合你的代码看:
对于
char s[] = "Clang";:
编译器会先把字符串常量"Clang"(包括末尾的\0)放到程序的只读常量区,然后在栈上开辟一块和这个字符串长度一样的数组s,再把常量区里的"Clang"内容复制到s里。这里的"Clang"本身是有地址的,你可以用printf("%p\n", "Clang");打印出来,而s是栈上的数组,它的地址和字符串常量的地址完全不同。对于
char *p = "Wonder";:
这里的指针p直接存储的就是字符串常量"Wonder"在只读常量区的地址!你可以通过printf("%p\n", p);或者printf("%p\n", "Wonder");看到同一个地址。不过要注意:字符串常量是只读的,如果你尝试修改p[0] = 'w';,这属于未定义行为,轻则程序崩溃,重则出现奇怪的bug。
总结一下:数值常量没法合法获取独立地址,而字符串常量一定有自己的内存地址,并且存储在只读区域里~
内容的提问来源于stack exchange,提问作者hoo
相关产品推荐
相关产品推荐

