2013-10-24 79 views
3

現在我可以指望使用var_num=sizeof(var)/sizeof(var[0]);第一維它通過我haved研究和正在使用我的代碼,但問題是我不知道它是如何工作的,在我的輸出方式它顯示20/4 = 5和我想不通的地方是20和4來做到了,我只想問如何做這些值被sizeof(var)sizeof(var[0])進賬,這是什麼均值爲零,是指的第一或第二尺寸?計數多維數組的第一個維度

#include <stdio.h> 
#include <conio.h> 
void main(){ 
char *var[][2]={ 
     {"var0-0","var0-1"}, 
     {"var1-0","var1-1"}, 
     {"var2-0","var2-1"}, 
     {"var3-0","var3-1"}, 
     {"var4-0","var4-1"}, 
     }; 
int var_num=sizeof(var)/sizeof(var[0]); 
clrscr(); 
printf("%d/%d = %d",sizeof(var),sizeof(var[0]),var_num); 
getch(); 
} 
+2

這些值很難相信。我在32位機器上得到了'40/8 = 5'。 40是總大小,8是一個條目的大小(這是一個char * [2]',所以我在我的第一維中有5個元素,如果你在同一行上做同樣的事情,你會得到'8/4 = 2',因爲一行由2個條目組成,每個條目4個字節。 – glglgl

+0

在64位機器上,結果是'80/16 = 5'或'16/8 = 2'。 – glglgl

+0

也許你的輸出來自你的程序的前一版本在陣列中只有一個二分之一的缺陷 – glglgl

回答

4

讓我們複雜的例子樂趣。說,我們已經

面積 a
char a[10][20][30] = { }; 

sizeof(char) * 10 * 20 * 30;所以sizeof(a) = 6000(as per C99 standard)。 a可以被看作是(20)數組(30)字符的(10)數組的陣列。現在

  • a[0]將一個尺寸較小的給我們的(30)的字符(20)陣列的陣列
  • a[0][0]會給我們的(30)字符的數組
  • a[0][0][0]是一個字符。

在所有這些例子中0只不過是相應數組級別的第一個元素。

現在發現通過執行sizeof(a)/sizeof(a[0])所述陣列的長度是植根於上述邏輯一招。 sizeof(a[0])不過是30個字符數組的20個數組的數組的大小,它是600. sizeof(a)/sizeof(a[0]) = 6000/600 = 10,返回第一維的長度。類似的數學也可以用於更高維度。

由於在你的問題中,你有一個指針類型char*sizeof(char*)應該被視爲將乘以每個維度的長度的基本因素。指針類型的大小取決於機器/體系結構類型和您使用的編譯器。


我們每個人都會有不同的機器,並在其上運行不同的編譯器,所以我們需要解釋一個共同的參考。在online compiler gives the result40/8 = 5中運行您的程序。就像我上面所說的那樣,根據平臺和編譯器的不同,指針類型的大小也會有所不同。

就像你寫的評論,你的陣列是char* [5][2]類型。與[0]相關將刪除一個級別,我們已經char* [2];因此sizeof(var[0]) = sizeof(char* [2]) = 8,假設兩個字符指針的大小是8,這意味着sizeof(char*)在該在線機器上是4。在此基礎上sizeof(var) = 4 * 5 * 2 = 40,這就是我們在輸出中看到的,因此正確地給出第一個數組長度爲5.

現在,您的輸出像mentioned by glglgl一樣有點不同機器或編譯器的數據模型是16位);你將它與你的編譯器一起運行的機器似乎給出了一個字符指針的大小,例如sizeof(char*) = 2。現在當你做var[0],我們已經char* [2];其大小等於sizeof(char*) * 2 = 2 * 2 = 4。同樣sizeof(var) = 2 * 5 * 2 = 20。因此,您已將20/4 = 5作爲輸出。

我怎麼知道每個第一維的元素有多少位,我的意思是通過計算?

char* [5][2]第一維度的每一個元素是類型char* [2],因而它的尺寸被2 * sizeof(char*)

希望它有幫助!

+0

我很難理解它,對不起,請你進一步解釋一下,上我的第一維是5,第二維是2,還有20乘30的倍數我知道,但如果我只有我的var [0],沒有地方乘以它從哪裏來的4 ? – 707

+0

更新了答案以澄清您的特定問題。 – legends2k

+0

謝謝你,真的很有幫助! – 707

2

20是以字節爲單位的陣列的大小和4是您的以字節爲單位再次陣列的單個元件的尺寸。一個數組具有相同類型的所有元素,因此具有相同的大小,因此您可以通過將其大小除以單個元素的大小來獲得其長度。您不必使用第0個元素,也可以使用其他元素(如果您確定存在具有此類索引的元素)。

2

var[0]char **類型的,因此它是一個指針。在32位系統上,地址需要4個字節,因此指針的大小爲4.

sizeof(var)等於20,因爲在char **類型的數組中有5個元素。

+0

'var [0]'是一個由兩個char *組成的數組,它的大小應該是8或者16. – pburka

1

「零是什麼意思?」

sizeof(var[0])正在詢問第一維中元素的大小。零是任意的,但是是常規的。所有元素都具有相同的大小。元素0是{"var0-0","var0-1"},這是一個包含兩個指針的數組。它的大小可能在32位系統上爲8,或在64位系統上爲16。元素1應該是{"var1-0","var1-1"}

0

您的回答非常有幫助,我得出結論:根據我使用的位系統,我的第一維的單個元素可以被不同地讀取,其中位可以更大或更小,但價值將保持比例,我仍然會得到相同的價值。

+0

但是我有一個問題,我怎麼知道每個第一維的元素有多少位,我的意思是通過計算? – 707