2011-10-08 59 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個字節。