一、靜態數組。
比如 int int_ary[5] ,靜態數組在編譯的時候就知道了數組長度,這對編譯器來說挺好實現的。
用得最多的大概就是sizeof了吧:
#define countof_macro(x) (sizeof((x)) / sizeof(x)[0])
對於C++,可以用模板。
如果將數組作為函數形參的話,它會退化成一個指針,但是引用則不會。使用引用帶來的另外一個問題就是,聲明參數時必須知道數組長度——我要是知道我還費這勁干啥?解決方法就是使用模板,將數組引用的數組大小聲明為模板參數:
//錯誤的做法:這里形參已經退化為指針了 int countof_func_para(int int_ary[5]) { return countof_macro(int_ary); } //正確的做法 template<size_t n> int countof_template(const int (&int_ary)[N]) { return N; }
二、動態數組。
動態數組的長度可以在運行時指定,所以編譯器也不知道它的長度。但是操作系統總該是知道的,不然釋放的時候就知道該釋放多少內存了。在VC中,提供了這樣的函數用來獲取由calloc, malloc, 或者 realloc分配的內存的長度(bytes)。另,據說Borland C和GCC也實現了這個函數。
size_t _msize(void *);
注意:若傳進去的指針不是指向堆里的區域的話,Debug版會有assertion failed。