2016-04-13 11 views
1

このコードが正常に動作し、実行時に次のエラーが表示されない:コードを示すエラー***スタックが検出スマッシング***:./a.out終了中断(コアダンプ)

スタックが検出スマッシング:我々はそれが働くI、Jとの一時を宣言した場合./a.outは、しかし
中止(コアダンプ)

を終了しました。 ifブロックにtempを宣言するとエラーが表示されます。配列サイズを明示的に宣言すると、エラーは表示されません。私は自分のコードをGNUコンパイラでコンパイルしています。

#include<iostream> 

using namespace std; 

int main() 
{ 
    int i, j; 
    int a[] = {3, 2, 4, 1}; 
    int temp; 

    for(i = 0; i < 4; i++) 
    { 
     for(j = 0; j < 4 - i; j++) 
     { 
      if(a[j] > a[j + 1]) 
      { 
       int temp; 
       temp = a[j]; 
       a[j] = a[j + 1]; 
       a[j + 1] = temp; 
      } 
     } 
    } 

    for(i = 0; i < 4; i++) 
    { 
     cout << a[i] << endl; 
    } 

    return 2; 
} 
+6

'j 'が3のとき、配列の境界を越えている' a [4] 'である' a [j + 1] 'にアクセスします。 –

+1

'j == 3 'のとき、' a [j + 1] 'を伴うバッファオーバーラン。 – Unimportant

+0

あなたのうちの1人は、この回答をコメントではなく、追加する必要があります。 – TriskalJM

答えて

1

コードにはa[j+1]がアクセスします。 jが4の場合、これは範囲外のa[4]にアクセスしようとします。 aのサイズは4なので、最後の要素はa[3]です。

境界外の配列インデックスへのアクセスは未定義の動作です。それはうまくいくか、そうでないかもしれません。あなたのプログラムの埋蔵メモリ理由aため、

int a[]={3,2,4,1}; 
int temp; 

この問題が発生し、それが正しいことの後にメモリにtempを配置します

あなたがこれを書いたときにあなたが言う、あなたのプログラムがクラッシュしません。したがって、値a[4]を変更しようとすると、実際には値tempが変更されます。

int temp;を削除すると、あなたのプログラムは、a[4]に対応するメモリ位置に他の変数を配置していないようです。そのメモリロケーションへのアクセスがないため、クラッシュします。

関連する問題