为什么str [5],str [] =“1234”和str = malloc(5)有不同的大小?

时间:2017-06-19 12:47:24

标签: c arrays pointers sizeof

请考虑以下声明:

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

如果我让程序使用strchar str[] = "1234"将5个字节的内存分配给char str[5];,则str的大小为5个字节。但是当我用char *strmalloc分配5个字节时,str的大小仍然是8个字节,这是指针的大小。我希望str3的大小与malloc分配给它的内存量相对应。

为什么我错了?

5 个答案:

答案 0 :(得分:2)

TL; DR - Arrays are not pointers and vice-versa

在您的代码中,str1str2“数组”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。