2010-11-29 81 views
6

有沒有什麼辦法可以加快在C中獲取數組大小?C中有數組大小/長度的快捷方式嗎?

打字sizeof(array)/sizeof(int)每次變老。是否有任何C庫有類似.length或有某種方式可以將sizeof(array)/sizeof(int)定義爲某種類型的較短常量(可能還使用點符號)?

+0

[C中是否有標準函數會返回數組的長度? ](http://stackoverflow.com/questions/1598773/is-there-a-standard-function-in-c-that-would-return-the-length-of-an-array) – 2010-12-11 06:39:13

+0

C'S治療陣列是許多胃灼熱的來源。 – 2012-03-22 22:38:56

回答

11

您可以使用sizeof(array)/sizeof(*array)並使宏。

#define length(array) (sizeof(array)/sizeof(*(array))) 
3

你總是可以只寫一個宏來做到這一點。請注意,它不能作爲函數使用,因爲您必須將數組降級爲指向其第一個元素的指針,所以它只會返回sizeof(int *)/sizeof(int)

#define INTSIZE(array) (sizeof(array)/(sizeof(int)) 

,或者更一般地說...

#define SIZE(array, type) (sizeof(array)/(sizeof(type)) 

哇,downvotes。好吧,這也將工作:

#define SIZE(array) (sizeof(array)/(sizeof((array)[0])) 
+2

-1不必要的類型 – 2010-11-29 20:51:11

+0

要擴大Let_Me_Be的評論,你可以寫'的sizeof ARR/*的sizeof和arr`不用擔心在所有類型的*(雖然在宏觀的背景下,可能會更安全應該被寫作` (的sizeof(ARR)/ *的sizeof(ARR)`)。 – 2010-11-29 21:04:30

11

用C歸結爲宏所有的解決方案:

#define ARRAY_LENGTH(array) (sizeof((array))/sizeof((array)[0])) 
2

簡短的回答是 「不」;在C中,沒有辦法根據單獨的數組表達式獲得數組中的元素數目。這個技巧大致和它的效果一樣好,它的使用僅限於數組類型的表達式。所以下面將不工作:

char *foo = malloc(1024); 
size_t count = sizeof foo; 

count接收(在典型的桌面架構4)指針類型的字節數,而不是在分配的塊。

char arr[100]; 
char *p = arr; 
size_t count = sizeof p; 

同上。

void foo(char *arr) 
{ 
    size_t count = sizeof arr; // same as above 
    ... 
} 

void bar(void) 
{ 
    char array[100]; 
    foo(array); 
    ... 
} 

同上。

如果你需要知道有多少元素是一個數組,你需要單獨跟蹤信息。

C的陣列治療是胃灼熱的lot的來源。