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

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

為什么C和C+編譯器允許函數簽名中的數組長度不被強制執行?

為什么C和C+編譯器允許函數簽名中的數組長度不被強制執行?

C++ C
達令說 2019-06-26 16:51:46
為什么C和C+編譯器允許函數簽名中的數組長度不被強制執行?這是我在學習期間發現的:#include<iostream>using namespace std;int dis(char a[1]){     int length = strlen(a);     char c = a[2];     return length;}int main(){     char b[4] = "abc";     int c = dis(b);     cout << c;     return 0;}所以在變量中int dis(char a[1]),[1]似乎什么也不做因為我可以用a[2]..就像int a[]或char *a..我知道數組名是一個指針,以及如何傳遞數組,所以我的困惑不是關于這個部分。我想知道的是編譯器為什么允許這種行為(int a[1])?;蛘咚€有其他我不知道的意思?
查看完整描述

4 回答

?
onemoo

TA貢獻883條經驗 獲得超454個贊

語法設計上如此,編譯器自然也要遵循這一規則了。

在使用中記住這一點就好了。? 如果你一定要知道為什么當年 K&R 要設計成這樣,那么...我也不知道。 不過從另一個角度想,為避免對數組參數額外的壓棧開銷,函數對數組參數的訪問幾乎都是以額外尋址的方式實現的,所以這樣的設計從工程師角度來看是更符合直覺的。C語言本來就是源于工程實踐的,也許這也是原因之一吧(猜)。

當然,有時候我們希望傳遞數組,并且希望函數對數組的訪問不要越界。但因為 C 語言有這樣的特性,所以很多函數在數組參數后還設計了一個整型參數。我想你應該能夠猜到這個整型參數是做什么用的。對!就是讓用戶傳入數組的大小,這樣至少能讓函數知道傳入的數組有多大(以避免訪問越界等)。


另外,C99 標準新增加了額外的語法,可以在聲明函數時允許用戶限定數組參數的最小容量。

語法示例: int func(int a[static 10]);

關鍵就是那個 static,這樣限定傳入的數組必須至少能容納 10 個元素。

PS. 這個新語法似乎用的不多,大家已經習慣了老方法。

PPS. 注意,C++ 并沒有這個新用法。并且再強調下,盡管看起來很像,但一定要把 C 和 C++ 看作是兩門不同的語言。C++ 看似像 C 的部分在語法上和 C 有著很多微妙的差異。

PPPS. 我怎么感覺前面幾個回答都是機翻呢...


查看完整回答
反對 回復 2019-06-27
?
鴻蒙傳說

TA貢獻1865條經驗 獲得超7個贊

這是將數組傳遞給函數的語法的一個怪癖。

實際上,在C中傳遞數組是不可能的。如果您編寫的語法看起來應該傳遞數組,那么實際發生的情況是傳遞一個指向數組第一個元素的指針。

由于指針不包含任何長度信息,因此[]在函數中,形式參數列表實際上被忽略了。


查看完整回答
反對 回復 2019-06-26
  • 4 回答
  • 0 關注
  • 805 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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