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

时间:2011-10-08 18:29:15

标签: c sizeof

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

#include <ctype.h>              /* Character types                       */
#include <stdio.h>              /* Standard buffered input/output        */
#include <stdlib.h>             /* Standard library functions            */
#include <string.h>             /* String operations                     */
#include <sys/types.h>          /* Data types                            */
#include <sys/wait.h>           /* Declarations for waiting              */
#include <unistd.h>   

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

7 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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更有趣的案例:

答案 4 :(得分:0)

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

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

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

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

答案 5 :(得分:0)

我将详细阐述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或左值。

答案 6 :(得分:0)

答案很简单。

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