该字符数组是否存储在栈上?函数调用时需复制字符串至栈吗?
关于栈上字符数组初始化的复制行为问题
先看你给出的代码:
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
相关产品推荐
相关产品推荐

