每行代码分配多少内存?

时间:2011-05-22 14:39:42

标签: c memory

char *str1 = "warning";
char str[] = "warning";
char str3[] = {'c', 'a', 't'};
char *str4[] = {"warning", "program"};
char *str5[2][20] = {"waring", "program"};

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

2 个答案:

答案 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