2012-03-08 64 views
0

我聲明在我的C下面的結構++程序:不同數據類型的sizeof(datatype_pointer)/ sizeof(datatype)的不同值爲什麼?

struct person { 
     char name[10];  /* first name */ 
     char id[10];  /* ID number */ 
     off_t pos;  /* position in file, for demonstration */ 
    } people[] = { 
     { "arnold", "123456789", 0 }, 
     { "miriam", "987654321", 10240 }, 
     { "joe", "192837465", 81920 }, 
    }; 

     j = sizeof(people)/sizeof(people[0]);  /* count of elements */ 

給出J = 3這裏,即,沒有在數組中的元素;始終即使您添加或減少元素...

  char b[8]; 
     i = sizeof(b)/sizeof(b[0]); 

給我的價值=常數= 4我的機器上。

現在這就是合理的的sizeof(字符*)是我的機器和的sizeof(char)的太是恆定的恆..

但只要我宣佈結構的人情況下,sizeof(人*)和sizeof(人)也應該是不變的,它也應該產生一個常數值,不是嗎?

+2

我不相信'char'變種總是給你4 ...(http://ideone.com/eeniL) – 2012-03-08 14:14:00

+0

它在我的機器上給出4,我執行了代碼。 sizeof(char *)取決於在我的機器上容納地址所需的字節,sizeof(char)總是爲1,不是。所以,它需要4 * sizeof(char)來容納我的機器上的地址... – bhuwansahni 2012-03-08 14:18:20

+1

這篇文章是爲什麼人們應該發佈完整程序而不是代碼片段的一個很好的例子。請發佈最短的完整程序來演示您的問題。 http://sscce.org – 2012-03-08 14:19:19

回答

5

你的編譯器是錯誤的。

char b[8]; 
i = sizeof(b)/sizeof(b[0]); 

應該產生i==8

您得到的struct大小的結果是正確的。如果我是你,我會切換編譯器。

如果您要將b傳遞給計算大小的函數,那麼您就是對的。但是現在的代碼是,沒有。

此外,如果它是一個函數計算sizeof(people)/sizeof(people[0])其中收到people作爲參數,你也會得到一個常數。

這是因爲數組在參數傳遞時衰減爲指針。

+0

我嘗試了Microsoft Visual C++的代碼,現在就開始工作,謝謝! – bhuwansahni 2012-03-08 14:25:56

4

你確定你實際上是將sizeof應用到數組而不是指針嗎?

在這樣的情況下,函數參數實際上是一個指針,所以你會得到i == sizeof(char*)

void f(char b[8]) { 
    i = sizeof(b)/sizeof(b[0]); 
} 

你張貼絕對應該給數組元素的數量的代碼。如果沒有,那麼你的代碼中有其他東西很奇怪,或者你的編譯器被無望地破壞了。

1
char b[8];   
    i = sizeof(b)/sizeof(b[0]); 

這應該只給出8的值。 sizeof(b)將給出數組的大小,而不是sizeof(char *)。

相關問題