2017-11-18 6 views
0

私は2つの配列を持っており、両方から特定のインデックスの値を取得する必要があります。これをしている間、私は何か奇妙なことがあります。 arr1のインデックス-1の値を出力すると、0が得られ、同じことがインデックス8で起こります。配列の範囲外のinidcesは0として返されると判断しました。私がarr2で同じことをすると、インデックス-1の値として29が得られます。
私は間違って何をしていますか?配列の負のインデックスを持つ矛盾した結果

int arr1[] = {33, 12, 75, 85, 62, 14, 100, 29}; 

printf("Nummer -1: %d\n",arr1[-1]); //outputs 0 
printf("Nummer 8: %d\n",arr1[8]; //outputs 0 


int arr2[] = {85, 15, 84, 96, 4, 45, 55, 12, 25, 68}; 
printf("Nummer -1: %d\n",arr2[-1]); //outputs 29 

注:GCCコンパイラ

+0

有効なアドレスを指している限り、負のインデックスを使用することができます。それ以外はUB – coderredoc

+0

@ypercubeᵀᴹ-1です。 – Ned

答えて

4

は、私は、配列の範囲外のインデックスを描画するための間違った結論だ0

として返されると結論付けました配列の範囲は未定義の動作を生成します。アクセスによって任意の値が生成されることもありますが、プログラムがクラッシュする可能性もあります。定義されていない動作が呼び出されると、プログラムは無効な状態になります。

arr2と同じことをすると、インデックス-1の値として29が得られます。

この場合、プログラムは異なる配列(つまり、最後の値はarr1)から読み取っているように見えます。しかし、これはまだ未定義の動作です。そのため、結果として無効なプログラムになります。

+0

ありがとうございました! – Ned

1

CおよびC++での違法な負の配列インデックスとLinuxのミントのブロック:私はコードを使用しています。それはCでundefined behaviour呼び出される

角括弧[] における発現に続いて後置表現は、配列オブジェクトの要素の添字指定され添字C11§6.5.2.1配列から。 サブスクリプト演算子[]の定義は、E1[E2]が であり、(*((E1)+(E2)))と同じです。ためE1は(等価、配列オブジェクトの最初の要素へのポインタ)配列オブジェクト であり、E2が整数である場合、バイナリ+オペレータに適用 変換規則のE1[E2]はE2番目の要素を指定しますE1 (ゼロから数えて)。外のインデックスへのアクセス:

Clangコンパイラ生成される警告

warning: array index -1 is before the beginning of the array [-Warray-bounds] 
printf("Nummer -1: %d\n",arr1[-1]); //outputs 0 
関連する問題