為什麼C 的陣列必須要指明尺寸大小

時間 2021-05-30 14:41:47

1樓:

作為小白,剛才解決了乙個bug。

程式編譯沒問題,但是一執行就Segmentation fault (core dumped)

後來查資料,發現在對陣列賦值前,要先初始化其大小,比如 double a[50];

或者在後面用,a.resize(50);來確定大小。

小白回答,請輕噴。

2樓:

編譯可執行檔案時,區域性變數陣列分配棧空間指令是寫死的。你不給乙個確定值,就沒法確定這條指令,就沒法完成編譯。

全域性變數陣列也同理類似,不給確定值,生成檔案時不知道給data節區留多大空間,沒法完成編譯。

3樓:Khellendros

靜態陣列只是從c繼承過來的而已,並沒有什麼「精妙之處」,並且原生陣列是不推薦使用的。

如果想用靜態陣列可以使用std::array,想用動態陣列可以使用std::vector,比原生陣列功能更豐富而且更安全。

標準庫可以看成語言的一部分,不應該區別對待

4樓:龍騰道默默地

這不是C++的優點或者說功能,所以不能直接為這個設計作論證。

當然,也不能說這是C++的缺點或者說BUG。

確切地說,這是C++的優點(計算機工作量小,運算效能高)的代價(程式設計者工作量大,開發效率低)。

你當然可以實現乙個自製的可以隨意變更尺寸的陣列,只是當你在所有地方都這樣做時,就和使用更高階的語言程式設計沒區別了——犧牲效能換取編寫的效率。

我想C++中也很可能已經提供了不需要那麼高效率的使用方便的語法或者標準庫,道理一樣。

5樓:蕭涵

單純說陣列,定義乙個陣列編譯器得知道為你開闢多大的記憶體(棧上),這個大小是編譯期就必須的知道的,所以要麼你明確提供大小,要麼提供乙個初始化列表,讓編譯器自己數。

int a[3]; //3個元素陣列int a = ; //3個元素陣列C99標準支援變長陣列VLA,可在執行時確定陣列大小。

6樓:Milo Yip

C++ 的型別系統是編譯期的、靜態的。若 C++ 允許如 C99 VLA 的功能,那麼 sizeof()、decltype() ,甚至是 template 引數都可能要支援動態的陣列型別,要麼就不容許在這些地方使用 VLA。

如果真的需要類似的功能,大部分編輯器/平台提供非標準的 alloca()(Windows 有 _malloca() 和 _freea()),可在棧上動態分配空間。

7樓:Excelle Su

不然呢?不指明尺寸大小怎麼去給你分配記憶體空間呢?

C99是支援VLA,能用變數來指明陣列長度,但實際上是一回事,陣列的大小在建立的時候也是固定的。

你要知道,C/C++裡面的陣列跟更高階語言裡面的陣列或者List不是一回事,雖然他們都能用下標訪問。C/C++的陣列是要跟一塊連續,已知大小,固定的記憶體空間(而且分配在棧上)對應的,而後者在底層的實現並不是C/C++裡面的陣列,而是其他的一些東西,比如動態分配的記憶體空間(C的話只能malloc/free,C++就用new和delete)或者鍊錶,也可能是STL。

而在C++裡面如果想要動態的效果你應該去用STL,比如vector,deque這些。

8樓:大鈾子

C++有兩種「陣列」。

第一種是array,宣告方式為:

array《型別,長度》 a;

用途主要是存長度限定或者需要高速運算的內容,比如存世界上所有大洲的名字,只有6個值的雜湊臨時陣列,或者某人的生日。

另一種是vector,宣告方式為:

vector《型別》 v;

用途主要是存放長度不定的資料,或者不需要太高效能的場合。

對於字串,如果不是因為特殊原因要使用array,則可以使用string,宣告方式為:

string s;

string適合資料大部分小於16位元組的場合,或是資料方差較大的場合。但其實string對於其它場合的處理能力也足夠用。

至於自帶的陣列b[n],用處有很大的侷限,主要用於:

1、隨手寫個簡單的小程式;

2、對效能有非常高的要求;

3、需要使用變長陣列和伸縮陣列(需要C99支援);

4、編譯器對array支援差。

9樓:HOOCCOOH

因為語言比較貼底層,能少開銷就少開銷。

陣列肯定是放在記憶體上,記憶體是申請/分配出來的,你不知道大小就沒法分配(因為陣列要求連續記憶體,比如a[0]必須和a[1]貼著,不能像鍊錶一樣跳著存)。

vector,或如py的list,一般是事先分配一小份記憶體,不夠用了重新申請,把舊資料移過去,這就有額外開銷了。

10樓:藥罐子千里冰封

還是說C++語言裡面分靜態大小的陣列和動態大小的陣列?

是的,請使用 std::array 或者 new 或者 malloc 系列(不清真)

11樓:Myth52125

因為陣列中的元素在虛擬記憶體空間中連續,如果不給長度就不知道要分配的大小是多少。

後面的的變數也就不知道這個陣列結束的位址在哪,不知道自己應該存在那個位址。

慢慢學,就明白了。

C 中this指標什麼情況下是必須要用的?

Seeman 沒有什麼語法規則要求必須使用this。只有在區域性變數和成員變數同名,需要告訴編譯器,變數是區域性變數還是成員變數,需要使用this。但是這種情況,我認為是設計出了問題,盡量規避同名。而不是使用this來解決。c 有很多trick,但是不是給廣大程式設計師在日常工作中使用的。盡量規避。...

電腦晶元為什麼不能能往大了做?必須要那麼小嗎?

丁可銘 首先有乙個很大的問題就是散熱,越小的晶元功耗就越低,功耗低就意味著產生的熱量少,反之熱量就高,舉個例子比如說我們平常用的膝上型電腦,因為膝上型電腦散熱不如台式電腦,如果溫度太高,晶元的效能就會下降,並且會影響其他部件的使用年限,所以我們見到市面上主打輕薄的筆記本大多數都是限定晶元功率的,原因...

為什麼c 布林型別的最小尺寸是未定義?

Nessaj 參見n4810.pdf 6.7.1 Fundamental types 10 Type bool is a distinct type that has the same object representation,value representation,and alignment ...