char *str1 = "warning";
char str[] = "warning";
char str3[] = {'c', 'a', 't'};
char *str4[] = {"warning", "program"};
char *str5[2][20] = {"waring", "program"};
在我看来,第二行代码应该分配8个字节的内存,但正确答案是16字节。为什么?分配每行代码有多少内存?
char *str1 = "warning";
char str[] = "warning";
char str3[] = {'c', 'a', 't'};
char *str4[] = {"warning", "program"};
char *str5[2][20] = {"waring", "program"};
在我看来,第二行代码应该分配8个字节的内存,但正确答案是16字节。为什么?分配每行代码有多少内存?
这取决于你的意思是“分配”;这些方法都没有在malloc()
的意义上进行任何基于动态堆的分配。
如果您的意思是“多少空间保留在堆栈上”,那么第二行的答案可能是8,但是取决于您的平台和编译器。例如,编译器可能会决定将所有堆栈变量对齐到16字节边界。
当然,为了初始化str
,还需要至少8个字节的静态程序空间来存储字符串字面值"warning"
。编译器可能足够聪明,可以发现你在多个地方使用了相同的字符串,或者它可能不是。再次,它取决于。
关于唯一不依赖编译器的事实是sizeof(str)
应始终为8
。
不清楚这些是自动(堆栈)变量还是全局变量......这也会产生变化,因为如果在堆栈上,str []的初始化将在运行时完成(需要初始化代码的内存),而初始化将在编译时进行,如果是全局的话。 – 2011-05-22 14:57:43
@兰斯:这是一个很好的观点。 – 2011-05-22 15:00:44
先生,字符的大小总是8位,而不管我们使用的机器。那么,str []中的“堆栈空间”将如何依赖于平台或编译器......只有整数我猜...... – 2011-05-22 15:07:40
你是什么意思?
$ cat mem.c
#include <stdio.h>
int main() {
char str[] = "warning";
printf("%li\n", sizeof(str));
}
$ gcc mem.c
$ ./a.out
8
你怎么知道它分配的内存太多? – 2011-05-22 14:41:07