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

该字符数组是否存储在栈上?函数调用时需复制字符串至栈吗?

关于栈上字符数组初始化的复制行为问题

先看你给出的代码:

void frequentlyCalledFunction()
{
    char str[] = "Hello this is a really long string, imagine it's even longer"; // 存储在栈上
    printf("%s", str);
}

int main()
{
    frequentlyCalledFunction();
}

你的问题是:字符串字面量保存在程序的.data(或.rodata)段,而char数组存储在栈上,每次调用该函数时,程序是否都需要将该字符串从.data段复制到栈上?

答案

是的,每次调用frequentlyCalledFunction函数时,都会执行从字符串字面量到栈上数组str的复制操作。

原因解释

  • 当你用char str[] = "字面量"这种方式定义栈上数组时,这属于数组初始化操作。编译器会在函数的栈帧创建阶段(也就是每次函数被调用时),把存储在只读数据段(通常是.rodata,而非可写的.data,因为字符串字面量默认不可修改)的字面量内容,逐字节复制到栈上为str分配的内存空间中。
  • 区别于const char *str = "字面量":后者只是在栈上存储一个指向字面量的指针,不会复制字符串内容;而前者是实实在在地在栈上开辟了一块和字面量长度相同的内存,并用字面量的内容填充这块内存,所以每次调用都要完成填充(复制)动作。
  • 虽然部分优化级别较高的编译器可能在特定场景下(比如函数仅被调用一次)做优化省略复制,但从C语言标准的行为和常规编译逻辑来看,只要函数被多次调用,每次都会执行这个复制操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 00:52:03