请考虑以下声明:
char str1[5];
char str2[] = "1234";
char *str3 = malloc(sizeof(char) * 5);
每个str
的大小被打印:
printf("str1 has size %ld\n", sizeof(str1));
printf("str2 has size %ld\n", sizeof(str2));
printf("str3 has size %ld\n", sizeof(str3));
输出是:
str1 has size 5
str2 has size 5
str3 has size 8
我了解到指针的大小是 8 个字节。在这 3 种情况下,str
是一个指针,*str
对应字符串的第一个字符str
: 在这3种情况下,它的大小都是1个字节,也就是一个char
的大小.
如果我让程序分配 5 个字节的内存给 str
与 char str[] = "1234"
或 char str[5];
, 大小为 str
是5个字节。但是当我为 char *str
分配 5 个字节时与 malloc
, 大小为 str
还是8个字节,也就是一个指针的大小。我期望大小为 str3
对应于我分配给它的内存量 malloc
.
为什么我错了?
最佳答案
长话短说——Arrays are not pointers and vice-versa
在您的代码中,str1
和str2
是“数组”,而str3
是 “指针”。它们的尺寸是根据它们各自的类型打印的。
str1
根据定义有 5 个char
元素。str2
也有 5 个char
元素,初始值设定项 + 空终止符。str3
是一个指针,所以sizeof(str3)
===sizeof(char *)
[注意:这取决于在您的环境中,它不是固定的,最常见的值为 8(64 位 rach)和 4(32 位 arch)]
FWIW,使用 %zu
打印 sizeof
运算符的输出,因为它是 size_t
类型。
关于c - 为什么 str[5]、str[] = "1234"和 str = malloc(5) 有不同的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44631017/