2016-12-17 88 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; 
} 

首先我插入數組中的元素,然後打印的陣列的第零索引之後,我取字符串輸入。突然發生了什麼之後自動改變!我的第零陣列索引改變了。 它是如何可能的話,任何人都關心解釋這個值被取字符串輸入

output of a program in c++

arr[0]的價值得到了改變,爲什麼呢?

+3

請在這裏發佈代碼。 –

+2

這是無效的C++。您不能根據運行時確定的值分配數組。我們可以在新編譯器中使用 – xaxxon

+1

。我們可以在新編譯器中使用 –

回答

2

問題是您輸入的字符太多,爲cin >> ch;。由於m == 40,您宣佈它爲char ch[40]。這允許你輸入39個字符(不是40,因爲後面的'\0'字符),但是你輸入的不止是這個,所以它寫在數組邊界之外,這導致了未定義的行爲。在這種情況下,它溢出到arr陣列中。

我建議你使用std::string而不是char數組,然後它會自動擴展到合適的大小。

+0

但當我將數組的大小更改爲「char arr [m + 1]」時,它的工作原理很好。所以爲什麼當我們已經存儲在arr中並且特別是零索引時它影響數組。 –

+0

這兩個數組在內存中彼此相鄰。所以當你在'ch'數組外寫入時,它會寫入'arr'數組。 ''ar' [0]'是'ch'數組結尾之後的第一件事情。 – Barmar

+0

是的,當我使用字符串時它工作正常。但我想解釋爲什麼當我使用字符數組時它不起作用。但它改變了整數數組值... –

1

你已經偶然發現了一個緩衝區溢出。維基百科有一個基本的例子,以及關於這個主題的更多細節。 (Read more

這是當你侵佔CH數組的邊界並寫入到它的相鄰的存儲位置(在這種情況下,正好是ARR陣列)會發生什麼。