2012-03-25 22 views
6

用C編寫我的arduino微控制器板,我注意到了一個奇怪的行爲。數組[-1]是否給出數組中的最後一個元素?

因爲在我的程序中的邏輯錯誤的控制器訪問的整數數組的-1第i個元素。

int array[5]; 

array[4] = 27; 
// array[-1] gives 27 now. 

它是正確的,我用-1作爲元素選擇得到一個數組的最後一個元素?

+0

難道這是由於相同的邏輯錯誤,你首先*寫*到該位置,然後讀取你期望從它回來? – Irfy 2012-03-25 16:17:27

+0

@Irfy我知道你在想什麼,但事實並非如此。 – danijar 2012-03-25 20:20:56

回答

13

否,訪問索引範圍之外的元素是未定義的行爲。在你的情況下,數組開始之前的地址處的元素被設置爲27.

由於在C中訪問數組元素只不過是做「直線」指針算術,所以不允許傳遞負指數。您可以構建索引爲負值和正值的合法用例:

int raw[21], *data = &raw[10]; 
for (int i = -10 ; i <= 10 ; i++) { 
    data[i] = i; 
} 
+0

我運行了程序,但沒有崩潰。我明白算術運算正在發生。令人驚訝的是gcc編譯器不會因爲錯誤而抱怨,也不會給出任何警告。你知道那是爲什麼嗎? – 2015-07-23 04:55:34

6

否; array[-1]將不會訪問最後一個元素。它更有可能位於陣列之前存儲位置的存儲位置爲27。試試這個:

array[4] = 27; 
array[-1] = 0; 

然後測試是否array[-1] == array[4]。它們不會相同(假設你的程序在分配給array[-1]時不會崩潰)。

1

不,根據標準,這是不正確的。在數組外部訪問元素會調用未定義的行爲。

您的實現可以(我懷疑它!)提供該功能;但你真的應該不是依靠它。

2

與索引越界訪問數組並不總是你的程序崩潰。如果由-1訪問的內存在您的程序控制下,則會彈出一個未定義的值(該值由程序創建的其他數據存儲)。在你的情況下,這僅僅是巧合。

-4

如果你指的是C(你是),那麼沒有。如果您嘗試訪問負數索引的數組,您將會遇到越界異常。然而,Lua將這個確切的東西作爲一個特徵來實現。如果您訪問索引爲-1的Lua數組,它將讀取數組的最後一個元素。索引-2將讀取倒數第二個元素,等等。

附註:您可以通過編寫此

foo = {1,2,3,4,5,6,7,8,9,0} 
print(foo.length() * -1]) 

這將打印1.討厭惹惱你的同事,是不是。

相關問題