使用字符串文字进行数组初始化是否会导致两次内存存储?

Does array initialization with a string literal cause two memory storage?

int main()
{
    char a[] = "123454321";
}

"123454321"是字符串文字,字符串文字预留内存存储空间。 a 由同样导致内存存储的语句定义。即这个简单的语句char a[] = "123454321";造成了两种内存存储,一种是针对a,一种是针对"123454321"。对吗?

是的,没错。

请注意 = 右侧的对象本身不是字符串文字;它是一个初始化表达式,编译器没有义务将其存储为字符串。它可能会将其分解成多个部分,或者发出一系列即时存储而不是复制初始值,甚至(理论上)发出解压缩初始数据的缩短版本的代码。但是无论如何编译都会占用一些内存

如果编译器确实选择将初始值存储为字符串,则该值将需要是不可变的,因此它可以放在只读内存中 and/or 与字符串文字共享相同的值。另一方面,a 是可变的,可以更改。这么明显它一定有自己的记忆

最后,在一种情况下,编译器可能根本不保留 ant space。如果它可以证明删除不会导致可见的变化,它可能会优化掉未使用的数组和初始值中的一个或两个,就像您问题中的示例代码一样。