2011-05-22 32 views
1
char *str1 = "warning"; 
char str[] = "warning"; 
char str3[] = {'c', 'a', 't'}; 
char *str4[] = {"warning", "program"}; 
char *str5[2][20] = {"waring", "program"}; 

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

+5

你怎么知道它分配的内存太多? – 2011-05-22 14:41:07

回答

5

这取决于你的意思是“分配”;这些方法都没有在malloc()的意义上进行任何基于动态堆的分配。

如果您的意思是“多少空间保留在堆栈上”,那么第二行的答案可能是8,但是取决于您的平台和编译器。例如,编译器可能会决定将所有堆栈变量对齐到16字节边界。

当然,为了初始化str,还需要至少8个字节的静态程序空间来存储字符串字面值"warning"。编译器可能足够聪明,可以发现你在多个地方使用了相同的字符串,或者它可能不是。再次,它取决于

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

+0

不清楚这些是自动(堆栈)变量还是全局变量......这也会产生变化,因为如果在堆栈上,str []的初始化将在运行时完成(需要初始化代码的内存),而初始化将在编译时进行,如果是全局的话。 – 2011-05-22 14:57:43

+0

@兰斯:这是一个很好的观点。 – 2011-05-22 15:00:44

+0

先生,字符的大小总是8位,而不管我们使用的机器。那么,str []中的“堆栈空间”将如何依赖于平台或编译器......只有整数我猜...... – 2011-05-22 15:07:40

0

你是什么意思?

$ cat mem.c 
#include <stdio.h> 

int main() { 
    char str[] = "warning"; 
    printf("%li\n", sizeof(str)); 
} 

$ gcc mem.c 
$ ./a.out 
8