请考虑以下声明:
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
。
如果我让程序使用str
或char str[] = "1234"
将5个字节的内存分配给char str[5];
,则str
的大小为5个字节。但是当我用char *str
向malloc
分配5个字节时,str
的大小仍然是8个字节,这是指针的大小。我希望str3
的大小与malloc
分配给它的内存量相对应。
为什么我错了?
答案 0 :(得分:2)
TL; DR - 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位拱)] FWIW,使用%zu
打印sizeof
运算符的输出,因为它的类型为size_t
。
答案 1 :(得分:1)
获取指针的大小可以得到指针的大小,而不是指向的大小。获得大小8
意味着您使用的是64位系统,其中指针是64位(8字节)。
数组是固定大小的内存块,使用sizeof
运算符可以获得该块的大小。
答案 2 :(得分:1)
char str[]="1234"
的大小为5,因为它是str[5] = {'1','2','3','4',0}
的语法糖。
char str[5];
的大小为5 sizeof(char)*5
。
和
char *str = ...;
的大小为8,因为它是一个指针。
答案 3 :(得分:0)
比较这些代码段
char str2[] = "1234";
char *p = str2;
和
char *p = malloc(sizeof(char) * 5);
它们有以下共同点:指针p指向分配的内存的第一个字节。在第一种情况下,内存由编译器分配,在第二种情况下,内存是由您在堆中分配的。
为了更清楚,最好在C ++中考虑类似的代码片段。它们看起来像
char str2[] = "1234";
char *p = str2;
和
char *p = new char[5];
你会有
代表第一个代码段
printf( "%zu\n", sizeof( str2 ) ); // 5
printf( "%zu\n", sizeof( p ) ); // 8
代表第二个代码段
printf( "%zu\n", sizeof( char[5] ) ); // 5
printf( "%zu\n", sizeof( p ) ); // 8
不同之处在于,在第二种情况下,我们没有创建动态数组的名称。因此,您必须使用sizeof( char[5] )
代替sizeof( array_name )
。
答案 4 :(得分:-1)
我认为你的编译器是64位的,它总是赋予char *固定大小为8。