2016-11-24 122 views
1
#include <iostream> 
using namespace std; 
int main() { 
     int start_time[3]; 
     int final_time[3]; 

     int i; 
     for(i=0;i<3; i++) 
      cin >> start_time[i]; 

     for(i=0;i<3;i++) 
      cin >> final_time[i]; 

     int a[10]; 
     for(i=0;i<=10;i++) 
      a[i]=0; 

     for(i=0;i<3;i++){ 
      cout << start_time[i] << " " << final_time[i] << endl; 
     } 



    } 

如果我給下面的輸入:陣列輸入輸入成爲0

23 53 09 
23 53 10 

我們看到輸出是:

23 0 
53 53 
9 10 

爲何需要final_time的開始輸入按回車後等於0?

我該如何解決這個問題?

+1

我剛剛運行了您在本地機器中提供的相同代碼。我得到了預期的答案作爲沒有錯誤的輸出。你能重新檢查輸入嗎? – bharadhwaj

回答

1
int a[10]; 
    for(i=0;i<=10;i++) 
     a[i]=0; 

在本部分中,您將0寫入a[10]。但a[10]不存在。 a[]只有10個整數的空間,編號爲0到9.因此,你正在寫一個零到內存中的某個地方,並且你偶然覆蓋了你的final_time[0]。可能是別的東西,或者可能會讓你的程序崩潰。

通過修正你的循環到for(i=0;i<10;i++)像你的其他循環來解決這個問題。

在C++中寫入數組時出現未定義的行爲。這基本上意味着它沒有在標準中定義,並且每個編譯器供應商都必須爲他們的產品設計一些關於如果你這樣做會發生什麼的產品。所以這是相當隨機的,因此不好(tm)。當你切換編譯器時,你可能會得到不同的行爲,當你重新啓動你的程序時,你甚至會得到不同的行爲。就你而言,你的編譯器廠商(像其他許多人)決定,他們不會檢查開發者是否正確。他們只是將零寫入存儲器中的空間中,如果存在a[10]將會存在。但事實並非如此。記住,這個地方還有另一個變量。所以有一個它的價值被零覆蓋。

+0

這解決了我的錯誤,但底部循環如何影響上部循環?和 如果我打算訪問一個[10],它不存在我應該得到一個分段錯誤的權利,因爲我正在訪問一個尚未分配的內存? –

+0

@BandrevuAkhil編輯瞭解更多詳情。 – nvoigt

1

你調用由外邊界索引的一個不確定的行爲對於陣列a

for循環

for(i=0;i<=10;i++) 
     ~~~ 

應該使用i < 10索引從0到9對10個元素

+0

這解決了我的錯誤,但底部循環如何影響上部循環?和 如果我打算訪問一個[10],它不存在我應該得到一個分段錯誤的權利,因爲我正在訪問一個尚未分配的內存? –

+1

@BandrevuAkhil內存分配的單位大於單個數組的大小。在數組外部訪問並不總是會出錯,只會訪問分配給其他變量或由實現使用的內存。 – Barmar