int *A [10];
A[2][3]=15;
該語句沒有編譯時錯誤,但是當我運行該程序時,它給出了運行時錯誤。爲什麼?爲什麼賦值給指針數組不會給運行時錯誤有效?
編輯:我特別想知道爲什麼沒有編譯時錯誤?
int *A [10];
A[2][3]=15;
該語句沒有編譯時錯誤,但是當我運行該程序時,它給出了運行時錯誤。爲什麼?爲什麼賦值給指針數組不會給運行時錯誤有效?
編輯:我特別想知道爲什麼沒有編譯時錯誤?
這種結給人在C
沒有編譯時錯誤,因爲沒有語法錯誤或約束違反該編譯器應該判斷。 C不會對數組(或指針算術)進行任何綁定檢查。
您將被完全允許編寫使用無效內存的代碼(示例:取消引用無效內存位置),但如果編譯器爲此類代碼生成二進制文件,則運行該二進制文件將調用undefined behaviour。
然而,當我運行程序,它提供了一個運行時錯誤
在你的代碼,
int *A [10];
A
是10 int *
秒的陣列,它們都沒有顯式初始化。從片段看,看起來A
不在全局範圍內,即沒有static
存儲,所以這些指針中的每一個的內容都是不確定的。
所以,後來在寫作A[2][3]=15;
的過程中,你要訪問A[2]
(指針),它指向一個無效內存。這會調用未定義的行爲。
'A [2]'是數組'A'中的一個有效元素......您上一句話中的措詞可能會更好 – StoryTeller
@StoryTeller正確,但它不會指向任何有效的東西。請建議或隨意編輯,無後顧之憂。 :) –
@StoryTeller謝謝,我也加了一點。 :) –
我認爲更好的措辭將是*「未初始化的指針**在** A [2]」*。但這只是我。 – StoryTeller
這是出於同樣的原因是
編譯乾淨。爲了檢測無效操作,編譯器需要運行該程序。
爲什麼這應該是一個運行時錯誤?在哪裏進行那種會產生錯誤的檢查的邏輯? –