You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"的情况

这俩就不一样了——所有字符串常量在程序运行时都是有独立内存地址的!

咱们结合你的代码看:

  1. 对于char s[] = "Clang";:
    编译器会先把字符串常量"Clang"(包括末尾的\0)放到程序的只读常量区,然后在栈上开辟一块和这个字符串长度一样的数组s,再把常量区里的"Clang"内容复制到s里。这里的"Clang"本身是有地址的,你可以用printf("%p\n", "Clang");打印出来,而s是栈上的数组,它的地址和字符串常量的地址完全不同。

  2. 对于char *p = "Wonder";:
    这里的指针p直接存储的就是字符串常量"Wonder"在只读常量区的地址!你可以通过printf("%p\n", p);或者printf("%p\n", "Wonder");看到同一个地址。不过要注意:字符串常量是只读的,如果你尝试修改p[0] = 'w';,这属于未定义行为,轻则程序崩溃,重则出现奇怪的bug。

总结一下:数值常量没法合法获取独立地址,而字符串常量一定有自己的内存地址,并且存储在只读区域里~

内容的提问来源于stack exchange,提问作者hoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 12:27:50