char *str1 = "warning";
char str[] = "warning";
char str3[] = {'c', 'a', 't'};
char *str4[] = {"warning", "program"};
char *str5[2][20] = {"waring", "program"};
在我看来,第二行代码应该分配8个字节的内存,但正确答案是16字节。为什么呢?
答案 0 :(得分:5)
这取决于你所说的“分配”;这些方法中没有一个在malloc()
意义上进行任何动态的基于堆的分配。
如果你的意思是“在堆栈上预留了多少空间”,那么第二行的答案可能是8,但取决于你的平台和编译器。例如,编译器可能决定将所有堆栈变量与16字节边界对齐。
当然,为了初始化"warning"
,还需要至少8个字节的静态程序空间来存储字符串文字str
。编译器可能足够聪明,可以发现您在多个位置使用相同的字符串文字,或者可能没有。同样,取决于。
关于唯一不依赖于编译器的事情是sizeof(str)
应始终为8
。
答案 1 :(得分:0)
$ cat mem.c
#include <stdio.h>
int main() {
char str[] = "warning";
printf("%li\n", sizeof(str));
}
$ gcc mem.c
$ ./a.out
8