2016-12-17 9 views
-7
#include <iostream> 
#include <math.h> 
using namespace std; 

int main() 
{ 
    long int m,i; 
    cin>>m; 
    float first=0,second=0,disp=0; 
    int arr[m]; 
    char ch[m]; 
    for(i=0;i<m;i++) 
    { 
    cin>>arr[i]; 
    } 
    cout<<" before="<<arr[0]<<endl; 
    cin>>ch; 
    cout<<" after="<<arr[0]<<endl; 
    //puts(ch); 
    return 0; 
} 

最初に配列に要素を挿入してから配列の0番目のインデックスを出力します。突然何が起こったのですか。配列の私の0番目のインデックスが変更されました!!!それが可能だどう は、誰もがarr[0]のこの配列の値は文字列入力後に自動的に変更されます

output of a program in c++

値が変更しまっ説明する気だろう、なぜですか?

+3

ここにコードを記入してください。 –

+2

は有効ではありません。実行時に決定された値に基づいて配列を割り当てることはできません。新しいコンパイラで – xaxxon

+1

を実行することができます。新しいコンパイラで –

答えて

2

cin >> ch;の文字数が多すぎますという問題があります。 m == 40以降、char ch[40]と宣言しました。これにより、39文字を入力することができます(末尾の'\0'文字のため40ではありません)。しかしそれ以上に入力したため、配列境界外に書き込んでしまい、結果として未定義の動作になりました。この場合、配列はarrの配列にオーバーフローしました。

charアレイではなくstd::stringを使用することをお勧めします。自動的に適切なサイズに拡張されます。

+0

を参照してください。しかし、配列のサイズを "char arr [m + 1]"に変更すると、それは非常に効果的です。なぜ、arrと特にゼロインデックスに格納されているのか。 –

+0

2つの配列はメモリ内で隣り合っています。だから、 'ch'配列の外側に書くと、' arr'配列に書き込まれます。 'ar' [0]'は 'ch'配列の終わりの後の最初のものです。 – Barmar

+0

私は文字列を使用している間うまく働いた。私は文字配列を使用するとき、なぜそれが動作しないのか説明が欲しいです。それは整数配列の値を変更しました... –

1

バッファオーバーフローを見つけました。 Wikipediaには、このテーマに関する詳細と同様に、基本的な例があります。 (Read more

それはあなたがCH配列の境界をオーバーランし、それが(この場合はARR配列であることを起こっ)は、隣接するメモリ位置だに書き込むときに何が起こるかです。

関連する問題