2012-06-05 82 views
0

我正在嘗試一些基本的指針操作,並有一個問題,我想澄清。這裏是代碼片段我指的是指針故障

int arr[3] = {0}; 
*(arr+0) = 12; 
*(arr+1) = 24; 
*(arr+2) = 74; 
*(arr+3) = 55; 
cout<<*(arr+3)<<"\t"<<(long)(arr+3)<<endl; 
//cout<<"Address of array arr : "<<arr<<endl; 
cout<<(long)(arr+0)<<"\t"<<(long)(arr+1)<<"\t"<<(long)(arr+2)<<endl;; 
for(int i=0;i<4;i++) 
    cout<<*(arr+i)<<"\t"<<i<<"\t"<<(long)(arr+i)<<endl; 
//*(arr+3) = 55; 
cout<<*(arr+3)<<endl<<endl; 

我的問題是: 當我嘗試存取權限編曲+ 3外的for循環,我得到印刷所需的值55。但是當我嘗試通過for循環訪問它時,我得到了一些不同的值(在這種情況下爲3)。在for循環之後,它將值打印爲4.有人可以向我解釋發生了什麼?在此先感謝..

+1

你聲明大小爲3的數組,併爲其分配4個值。 –

回答

2

您已創建一個大小爲3的數組,並且您正嘗試訪問第4個元素。因此結果是不確定的。

由於您在堆棧中分配數組,第一次嘗試寫入第4個元素時,實際上是在爲堆棧分配的空間之外進行寫操作。在調試模式下,這將工作,但在發佈您的程序可能會崩潰。

第二次讀取第四個地方的值時,您正在讀取值4.這很有意義,因爲編譯器已經在變量i的數組後面分配了堆棧空間,在循環執行完成後具有值4.

+0

謝謝@kgiannakakis。 – frodo

0

由於數組已被定義爲3個元素,數據將按順序存儲,如12,24,74。當爲第四個元素賦值55時,它將存儲在內存中的其他位置,而不是順序存儲。第一次,Compiler正確地打印它,但它不能處理內存,因此它會打印垃圾值。