2011-01-07 56 views
0

請問第012行中使用sizeof data/sizeof *data的邏輯是this code一行C代碼的邏輯

... 
unsigned char data[16]; 
... 
size = fread(data, sizeof *data, sizeof data/sizeof *data, file); 
... 

由於

回答

5

這對於「數組中的元素數目」一個常見的C成語。

由於數組decays to a pointer最輕微的挑釁,*data是數組的第一個元素,因此它將數組的總大小除以其第一個元素的大小,給出元素的數量。

對於這種技術有任何可能的反對意見,無論是基於樣式的理由,它只適用於聲明爲數組的變量(不是那些作爲第一個元素的指針傳遞的變量 - 它依賴於衰減) - 指針尚未發生),或C++代碼中可能的破損情況;也就是說,它在舊的C代碼中仍然很常見。

+0

儘管在假設爲數組的東西上使用`* data`會讓我感到不安。我寧願看到`#define array_size(x)(sizeof(x)/ sizeof 0 [x])`(這是一個安全的宏,如果你碰巧在C++代碼中使用它,將無法用於重載` ]`運營商。) – 2011-01-07 06:46:47

2

它將數組的總大小除以每個元素類型的大小。 它返回數組中元素的數量

0

它給出了數組中元素的數量。因爲它是一個編譯時的值而不是運行時的值,所以它並不實際評估sizeof()中的任何內容,這很好,因爲即使任何指針爲null或超出範圍,它也能正常工作。

(有趣的事實:我的Windows的C運行時,不過已經有了_countof()宏正是這麼做的,並且在Windows SDK,還有的ARRAYSIZE()宏也做同樣的事情。)

0

它只是計算數組中元素的數量 - 即整個數組的大小除以數組中第一個元素的大小,得出元素的數量(數組中的所有元素都是相同的大小)。