2017-01-03 104 views
2
int *A [10]; 
A[2][3]=15; 

該語句沒有編譯時錯誤,但是當我運行該程序時,它給出了運行時錯誤。爲什麼?爲什麼賦值給指針數組不會給運行時錯誤有效?

編輯:我特別想知道爲什麼沒有編譯時錯誤?

+2

爲什麼這應該是一個運行時錯誤?在哪裏進行那種會產生錯誤的檢查的邏輯? –

回答

2

這種結給人在C

沒有編譯時錯誤,因爲沒有語法錯誤或約束違反該編譯器應該判斷。 C不會對數組(或指針算術)進行任何綁定檢查。

您將被完全允許編寫使用無效內存的代碼(示例:取消引用無效內存位置),但如果編譯器爲此類代碼生成二進制文件,則運行該二進制文件將調用undefined behaviour

然而,當我運行程序,它提供了一個運行時錯誤

在你的代碼,

int *A [10]; 

A是10 int *秒的陣列,它們都沒有顯式初始化。從片段看,看起來A不在全局範圍內,即沒有static存儲,所以這些指針中的每一個的內容都是不確定的

所以,後來在寫作A[2][3]=15;的過程中,你要訪問A[2](指針),它指向一個無效內存。這會調用未定義的行爲。

+0

'A [2]'是數組'A'中的一個有效元素......您上一句話中的措詞可能會更好 – StoryTeller

+0

@StoryTeller正確,但它不會指向任何有效的東西。請建議或隨意編輯,無後顧之憂。 :) –

+1

@StoryTeller謝謝,我也加了一點。 :) –

1

由於訪問未初始化的指針A[2]調用undefined behavior,這意味着就C標準而言,允許發生任何事情。

爲什麼沒有編譯時錯誤

由於標準不要求診斷(如編譯錯誤)在這種情況下發出的。

+0

我認爲更好的措辭將是*「未初始化的指針**在** A [2]」*。但這只是我。 – StoryTeller

0

這是出於同樣的原因是

​​

編譯乾淨。爲了檢測無效操作,編譯器需要運行該程序。

相關問題