C語言陣列定義時不初始化為什麼會報錯?

時間 2021-06-09 12:28:45

1樓:陌歸

a[i]代表一維陣列中下標為i的元素。

假如你定義了乙個a[5],呼叫的時候用的a[5]是越界訪問的下標為5的元素(因為事實上陣列a[5]的下標值只到4)……不是整個陣列。

只有在定義的時候a代表陣列。

2樓:薛非

先定義int ages[5];或int ages[ ];

再乙個乙個賦值是可以的,這不可能。

請如實描述問題,

沒有人能回答虛假的問題。

3樓:

如果你在定以後陣列再用"="賦值,這個"="運算子只做一件事情就是把右邊那貨的位址給左邊這貨。這條語句執行結果不是乙個物件(或者根本沒法執行),沒有單一的位址,只是會在定義的時候會被按照特殊規則解釋的語句。

編譯器在執行到"ages=;"的時候嘗試去先執行"="右邊的語句,發現這貨的結果不是我要的指標(或者是我不認識右邊這貨,除非是在定義語句),所以報錯了。

"編譯器會預設認為我在操作ages[0]的那塊記憶體嗎?"

不會。先不談這乙個問題,首先這有乙個概念性錯誤。我先來解釋一下最後乙個問題中的一小部分:""這貨是做啥的。你可以認為這貨是乙個Dereference運算子,它的任務是:

1.到這塊記憶體位址,抓[東西]返回。

2.到這塊記憶體位址,把[東西]放上去。

除非你儲存的是乙個指標的陣列,通常情況下xx[x]的結果只是那個陣列中元素的值,不再是指標了。

"ages ="這是在操作ages的內容,ages本身有自己的位址,它的內容是那個陣列的位址。所以ages=與ages[0]毫無關係。只能說ages與&(ages[0])的值相等,是可以相提並論的東西。

呼叫函式時為什麼是functionName(陣列名);

而不是functionName(陣列名[空/個數]);

傳引數的時候如果函式要的是乙個陣列的話,那麼它接收的只是乙個4位元組長的位址(陣列第乙個元素的的指標)。

像我之前所說的,陣列名,也就是ages,它的值是陣列第乙個元素的位址,正式函式想要的。

"陣列名[空/個數/whatever]"這個會執行Dereference運算子,會把位址相對應的值抓出來,而不再是位址了。

"如在函式內計算陣列元素個數。。。有什麼解決辦法?"

如果不事先約定陣列固定的長度,在函式內獲取的話,通常有兩種解決辦法。

一,約定乙個終止符。最好的例子就是乙個由char陣列組成的字串,事先約定好"\0"是陣列的終止符,在函式內我們從陣列頭部遍歷陣列,碰到了終止符就知道陣列的長度了。

二,我們讓函式多接受乙個引數,這個引數裡寫上傳進去陣列的長度。

C 用const定義的一維陣列,用已經初始化的指標指向該陣列的首位址為什麼無效,但指向其他位址可以

陸海綿 const修飾陣列本質是修飾的陣列元素,所以陣列中每乙個元素都是const,對應的指標型別是const型別,你把乙個const指標賦值給乙個非const指標當然是非法。const double p locked 合法 leopard const關鍵字對於指標 包括陣列 來說是看是修飾誰的,也...

c語言字串陣列初始化時剩餘長度全部為 0 嗎?

C語言答疑課堂 我覺得題主的問題有三個地方需要回答 1.char abc abc 這種寫法是不指定陣列的大小,由編譯器來決定陣列的大小,而且會在初始化的字串的最後自動加上乙個 0 這種寫法的好處是,不用擔心初始化的字串會否超過陣列的長度。2.char abc 10 abc 這種寫法是指明了陣列的大小...

在C 中,定義變數時直接初始化與先定義,後賦值在時間複雜度上有區別嗎?

Ivony 1 對於編譯器而言,在同乙個作用域中變數宣告位置對編譯結果沒有影響,變數只要在使用前被宣告即可。2 這個問題和時間複雜度一毛錢關係都沒有。 alphonsez 如果是簡單型別,比如int等,那麼定義的時候沒有初始值,那麼只是在stack上分配空間,並沒有額外初始化動作。然後再賦值就會把值...