2017-10-11 26 views
1

我嘗試以下代碼指向2D陣列與不相容的行長度

char arr[5] = {'A', 'E', 'I', 'O', 'U'}; 
    char (*p_arr)[1] = &arr; 
    printf("%c\n", p_arr[0][4]); //returns 'U' 

爲什麼沒有任何錯誤,因爲

char (*p_arr)[1] = &arr; 

似乎是從不兼容的類型的初始化(char (*)[5]而不是要求char (*)[1])?此外,p_arr[0][4]要求陣列的第5個元素應該只有1元素。這不是錯的嗎?

+0

你確定構建? 'p_arr'和'&arr'的類型是不同的,不應該允許初始化。 –

+2

至於我認爲你的問題是,C沒有邊界檢查。 –

+0

By _「C沒有界限檢查」_你的意思是說C編譯器不在'char(* p_arr)[1] = &arr;'中使用'[1]'信息。如果是這樣的話,C的靜態內存分配是不是有問題? –

回答

0

你的編譯器壞了/配置不正確/不合規。

數組指針指向具有1個元素的數組不兼容數組指針指向5個元素的數組。 簡單的賦值的C語言中的規則說,一個有效的指針分配必須是(C11 6.5.16.1重點煤礦):

  • 左操作具有原子,合格,不合格的或指針類型,和(考慮兩個操作數都是指向合格或不合格 兼容類型的指針,左邊指向的類型具有 右邊指向的所有類型的限定符;左邊操作數在右邊指向的所有類型的限定符都具有 。

如果我們刪除所有來自引用文字的正式標準方面,我們結束了這個簡單的英語:

=運算符的左操作數的指針類型,兩個操作數都指向兼容類型的指針。

這是不是在你的代碼的情況下,因此它含有一種被稱爲違反約束,意味着代碼違反了什麼是C標準允許的。

+0

對,我忘記了C編譯器沒有檢查邊界爲'p_arr [0] [4]'部分。 –

+0

您是否嘗試過執行'char(* p_arr)[1] = &arr;'部分代碼?我在他們的網站上下載了codeblocks IDE,你確定我的編譯器壞了/不符合? –

+0

@ Y.GP在我自己測試之後,編譯器會發出關於賦值不兼容類型的*警告*。但是你必須記住C的鍵入很弱,這可能是它不是錯誤的原因。 –