2011-10-08 61 views
-1

我测试使用在C/C sizeof操作++的与此代码:奇怪的情况下,同时使用的sizeof()运算用C

#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 
+4

因为您还没有阅读[comp.lang.c faq](http://c-faq.com/)...从第6节开始:) – pmg

+0

它是'int main'; C不是Java。 – Jens

+0

@Jens人早在Java出现之前就已经错误地将'main'输入为'void'。这是错误的,但没有理由提及Java,真的。 – amalloy

回答

3

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

4

由于尽管许多人声称,指针和数组不是100%可互换的C++。这是其中一个差异的明显例子。

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

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

+1

内存不是“分配给[指针]”。我在你的回答中强调这种可怜的措辞的原因是,对于指针的这种相同的错误观点可能首先是OP的问题的原因。 –

+0

修正了我的答案,以澄清指针和分配之间的关系(或缺乏关系)。 – abelenky

0

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

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在这里讨论:

0

sizeof操作产生了没有。类型的字节数。

sizeof des给出100,因为des的类型是char[100],char总是需要1个字节,并且有100个字节。

sizeof a给出了4因为a类型为char*,和一个字符指针,把你的平台上的4个字节(这是典型的32位平台。)

所以,SIZEOF只是工程上的类型是操作数(注意,sizeof是一个运算符,它不是函数/宏)。 sizeof不会与malloc交互,并且a指向动态分配的100个字节的开始是不相关的。

0

我会稍微解释一下abelenky的评论。你期望这两个typedefs产生同等类型吗?

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,或左值。

0

答案很简单。

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