C语言中字符数组与字符指针定义字面量的存储方式解析
字符指针与字符数组的字符串字面量存储机制差异
1. 字符指针指向字符串字面量的情况
对于 char *test = "instatic";:
- 字符串字面量
"instatic"会被编译器放在静态只读存储区(通常是程序的.rodata段),该区域内容在程序运行全程存在,且不可修改(修改会触发未定义行为)。 - 如果
test是局部变量,它本身存储在栈上,但其值是静态存储区中该字符串首字符的内存地址。
2. 字符数组用字符串字面量初始化的情况
对于 char test[] = "instatic?";:
- 这里的字符串字面量仅作为初始化数据源,编译阶段会被暂存到静态存储区,但运行时行为分两种场景:
- 若
test是局部数组(比如函数内部定义):编译器会在栈上分配一块长度等于字符串长度+1(包含终止符'\0')的内存,再把静态存储区里的字面量内容完整复制到栈上的数组中。此时数组test拥有独立内存空间,内容可修改,和静态区的原字面量无关联。 - 若
test是全局/静态数组:数组本身就存储在静态存储区,编译器直接用字面量内容初始化这块静态内存,无需额外复制操作。
- 若
简单总结:指针是直接指向静态区的字面量;数组是把静态区字面量的内容复制到自身的存储位置(栈或静态区),拥有独立的内存空间。
内容的提问来源于stack exchange,提问作者Aka
相关产品推荐
相关产品推荐

