C语言中字符串为何静态分配?局部字符串内存分配相关疑问
C语言局部字符串数组的存储疑问解答
首先要纠正一个常见误解:你示例里的代码char string[] = "hello world!",局部数组string本身是分配在栈上的,而用来初始化它的字符串字面量"hello world!"会被编译器放到.rodata(只读数据段)中。下面针对你的问题逐一解释:
为什么不把字符串数据直接存在栈中?
- 字符串字面量属于程序的常量数据,放到
.rodata段可以避免被意外修改,保证数据安全性。 - 编译器会自动合并程序中重复的字符串字面量,比如多个地方用到
"hello world!",只会存储一份,节省内存空间。 - 栈是程序运行时的临时存储区域,函数调用结束后栈帧就会被回收,但字符串字面量是程序运行全程可能用到的常量,放在静态数据段更合理。
字符串数据会在程序全程驻留内存吗?
- 存储在
.rodata段的字符串字面量,从程序启动到退出都会一直驻留在内存中,属于静态存储的一部分。 - 而栈上的局部数组
string,只在main函数执行期间存在,函数返回后栈空间会被释放,这部分数据也就不存在了。
这是否会造成内存浪费?
- 通常不会。字符串字面量是程序运行必需的初始化数据,而且编译器的合并优化会避免重复存储。
- 栈上的数组是临时分配的,用完即释放,不会长期占用内存。只有当程序中存在大量无意义的重复字符串字面量时,才可能出现轻微的内存冗余,但这种情况可以通过代码规范和编译器优化避免。
内容的提问来源于stack exchange,提问作者Carlitos_30
相关产品推荐
相关产品推荐

