在C中使用sizeof()运算符时出现奇怪的情况

我正在使用以下代码测试在C / C ++中使用sizeof运算符:

#include  /* Character types */ #include  /* Standard buffered input/output */ #include  /* Standard library functions */ #include  /* String operations */ #include  /* Data types */ #include  /* Declarations for waiting */ #include  void main() { char a[100]; char *des = malloc(100*sizeof(char)); strcpy(des,"abcded\0"); printf("%d\n",sizeof(des)); printf("%d\n",sizeof(a)); free(des); } 

为什么这个程序输出:

 4 100 

相反:

 100 100 

因为, 尽管很多人都断言指针和数组在C&C ++中并不是100%可互换的。 这是其中一个差异的明显例子。

指针的大小是4个字节(或任何平台特定的大小),无论它指向多少分配的内存。

数组的大小是数组的大小。

sizeof(des)返回指针的大小 – 在系统上为4。 它不会返回它指向的已分配空间的大小。

因为它返回指向分配的内存的指针des的大小。

 printf("%d\n",sizeof(des)); printf("%d\n",sizeof(a)); 

相当于以下内容:

 printf("%d\n",sizeof(char*)); //prints size of a pointer printf("%d\n",sizeof(char[100])); //size of a char array of size 100 

换句话说, sizeof是一个操作符,它根据您传递给它的表达式的类型进行操作。 因此,当您编写sizeof(des)时,表达式的类型char* ,因此它会在系统上打印sizeof(char*) ,它是4 。 但是在sizeof(a)情况下,表达式的类型是char[100] ,因此它打印sizeof(char[100]) ,即100

这里讨论一个更有趣的sizeof案例:

  • sizeof有两个论点

sizeof运算符产生no。 一个类型的字节数。

sizeof des给出100,因为des的类型是char[100] ,char总是占用1个字节,其中有100个。

sizeof a给出4,因为a的类型是char* ,并且char指针在您的平台上占用4个字节(这在32位平台上是典型的。)

因此,sizeof只适用于它的操作数类型(注意,sizeof是一个运算符,它不是一个函数/宏)。 sizeof不与malloc交互,并且指向100个动态分配字节的开头的事实是无关紧要的。

我将详细阐述abelenky的评论。 您是否期望这两个typedef产生等效类型?

 typedef char *string; typedef char string[100]; 

这两个怎么样?

 typedef struct { char *s; ... } header_t; typedef struct { char s[100]; ... } header_t; 

在这两种情况下,你的答案显然是否定的 是的,你可以编译des=a因为a产生指针,但a实际上是一个数组。

特别是,您也知道最后一个typedef为指针保留了无内存。 结果, a大致具有char * const类型,意味着a是指向非常量字符的常量指针,因此a=des给出类型错误。 我不知道如果说错误消息会抱怨数组, const或左值。

答案很简单。

des的类型是“char *”或字符的地址。 因此,使用sizeof询问编译器的问题是“存储字符地址需要多少内存(以字节为单位)?” 编译器响应4,因为您的程序和编译器具有32位(4字节)寻址。 当你在一个数组上使用sizeof时,你会问一个不同的问题,即“我需要多少内存(以字节为单位)来存储100个项目的字符数组?” 这里的答案是100项* 1字节= 100字节。