亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C中是否有一個標準函數可以返回數組的長度?

C中是否有一個標準函數可以返回數組的長度?

C
繁花不似錦 2019-09-02 15:49:51
C中是否有一個標準函數可以返回數組的長度?
查看完整描述

3 回答

?
青春有我

TA貢獻1784條經驗 獲得超8個贊

通常,在其他答案中描述的技術被封裝在宏中以使其更容易在眼睛上。就像是:


#define COUNT_OF( arr) (sizeof(arr)/sizeof(0[arr]))

請注意,上面的宏使用了一個小技巧,即將數組名稱放在索引運算符(' []')中而不是0- 如果宏在C ++代碼中錯誤地使用了一個重載項,則會這樣做operator[]()。編譯器會抱怨而不是給出錯誤的結果。


但是,請注意,如果您碰巧傳遞指針而不是數組,宏將默默地給出錯誤的結果 - 這是使用此技術的主要問題之一。


我最近開始使用我從Google Chromium的代碼庫中竊取的更復雜的版本:


#define COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / ((size_t)(!(sizeof(x) % sizeof(0[x])))))

在這個版本中,如果指針被錯誤地作為參數傳遞,編譯器會在某些情況下抱怨 - 特別是如果指針的大小不能被指針所指向的對象的大小整除。在這種情況下,除零將導致編譯器出錯。實際上至少有一個我用過的編譯器給出了一個警告而不是一個錯誤 - 我不確定它為那個除以零的表達式生成了什么。


那個宏沒有關閉錯誤地使用它的大門,但是它就像我在直接看到的那樣接近。


如果您想在C ++中工作時使用更安全的解決方案,請查看Compile time sizeof_array,而不使用描述Microsoft使用的相當復雜的基于模板的方法的宏winnt.h。


查看完整回答
反對 回復 2019-09-02
?
SMILET

TA貢獻1796條經驗 獲得超4個贊

不,那里沒有。


對于常量大小的數組,你可以使用Andrew提到的常用技巧,sizeof(array) / sizeof(array[0])但這只適用于聲明數組的范圍。

sizeof(array)給出整個數組sizeof(array[0])的大小,同時給出第一個元素的大小。

請參閱Michaels關于如何將其包裝在宏中的答案。


對于動態分配的數組,您可以跟蹤整數類型的大小,或者在可能的情況下使其以0結尾(即分配1個元素并將最后一個元素設置為0)。


查看完整回答
反對 回復 2019-09-02
?
繁星coding

TA貢獻1797條經驗 獲得超4個贊

數組中的元素數量x可以通過以下方式獲得:


sizeof(x)/sizeof(x[0])

您需要注意,數組在傳遞給函數時會降級為不帶大小信息的指針。實際上,大小信息永遠不可用于運行時,因為它是在編譯時計算的,但是您可以在數組可見的情況下(即,它尚未降級的情況下)可用。


當我將數組傳遞給我需要作為數組處理的函數時,我總是確保傳遞兩個參數:


陣列的長度; 和

指向數組的指針。

因此,雖然可以將數組視為聲明它的數組,但它在其他地方被視為大小和指針。


我傾向于使用以下代碼:


#define countof(x) (sizeof(x)/sizeof(x[0]))

: : :

int numbers[10];

a = fn (countof(numbers),numbers);

然后fn()將獲得它的大小信息。


我過去使用的另一個技巧(在我看來有點混亂,但我會在這里給它完整性)是有一個聯合數組并使第一個元素成為長度,如:


typedef union {

    int len;

    float number;

} tNumber;

tNumber number[10];

: : :

number[0].len = 5;

a = fn (number);

然后fn()可以訪問長度和所有元素,你不必擔心數組/指針二分法。


這具有允許長度變化的附加優點(即,使用中的元素的數量,而不是分配的單元的數量)。但我傾向于不再使用它,因為我認為兩個參數的數組版本(大小和數據)更好。


查看完整回答
反對 回復 2019-09-02
  • 3 回答
  • 0 關注
  • 777 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號