每行代码分配多少内存?

jua*_*ena 1 c memory

char *str1 = "warning";
char str[] = "warning";
char str3[] = {'c', 'a', 't'};
char *str4[] = {"warning", "program"};
char *str5[2][20] = {"waring", "program"};
Run Code Online (Sandbox Code Playgroud)

在我看来,第二行代码应该分配8个字节的内存,但正确答案是16字节.为什么?

Oli*_*rth 5

这取决于你所说的"分配"; 这些方法都没有做任何动态的基于堆的分配malloc().

如果你的意思是"堆栈上预留了多少空间",那么第二行的答案很可能是8,但这取决于你的平台和编译器.例如,编译器可以决定将所有堆栈变量对齐到16字节边界.

当然,还需要至少8个字节的静态程序空间来存储字符串文字"warning"以便初始化str.编译器可能足够聪明,可以发现您在多个位置使用相同的字符串文字,或者可能没有.再次,这取决于.

关于唯一不依赖于编译器的事情sizeof(str)应该始终是8.