2017-07-07 34 views
-5

當我運行該程序時,它會打印變量a的值。但是當我評論該行'cout<<&b<<endl<<&a<<endl;'時,它會打印一個垃圾值。 背後有什麼可以解釋的?cout value without touch variable C++

#include<iostream> 
using namespace std; 

int main() 
{ 
    int a = 9; 
    int b = 10; 
    int *pb = &b; 
    cout<<&b<<endl<<&a<<endl; 
    cout<<*(pb+1); 
} 
+3

*未定義的行爲* - '*(pb + 1);'訪問「越界」 – UnholySheep

+0

這是未定義的行爲,一切都會發生。並且調用約定與此有什麼關係 –

+3

因爲'pb'指向一個* single *'int'變量。當你執行'*(pb + 1)'時,它等於'pb [1]',它試圖使用'pb'作爲數組並且在數組中打印第二個*值。這超出了'pb'指向的範圍,並導致*未定義的行爲*。未定義的行爲會導致您的整個程序*不合格*並且無效。 –

回答

0

當您打印ab的地址時,會強制變量實際具有內存地址。否則,一個值可能被存儲在一個寄存器中,或者如果從未使用過,則根本不存在。

這是一種很常見的優化編譯器進行改造

const int a = 9; 
cout << a; 

cout << 9; 

,從不存儲a任何地方。

無論如何,沒有規則說明變量要存儲在內存中的位置和順序。這完全取決於編譯器。所以你的假設是​​(或&b - 1)是無效的。

-1

屏幕上的垃圾值是a和b的地址。你應該試試這個:

int *pb = &b; 
+0

你說得對,這個'cout <<&b << endl <<&a << endl;'會打印'a'和'b'的地址,但是無論你想用這個「答案」來實現什麼,只會產生編譯器錯誤。 – muXXmit2X

+0

Acc。對於這個問題,人們只是在詢問其背後的解釋,而不是詢問任何錯誤! – Piyush

+0

_你應該試試這個:'int * pb - >&b;'_ 你在暗示什麼是無效的語法,並且會產生編譯錯誤!順便說一句。我甚至不確定你在那裏試圖建議什麼。 – muXXmit2X

0

有兩個點在那裏你可以得到「胡言亂語」的價值觀但是其中只有一個是actualy其中垃圾被打印出來。

這個cout << &b << endl << &a << endl;將通過使用操作符地址打印地址ab。你看到的不是ab的值,而是存儲在內存中的位置。這些是十六進制值,每次運行程序時它們可能都會更改。這是預期的行爲。

然後有這個構造:*(pb + 1)這實際上是調用未定義的行爲。但爲什麼呢?首先pb是一個指針,所以它存儲一個地址,更具體地說是存儲地址b。您可以直接打印出pb,這會得到與cout << &b相同的結果,也可以使用取消引用運算符*對其進行解引用。所以這cout << *pb將打印的值不是地址pb指向(10 btw)。現在你的聲明有什麼問題 - (pb + 1)是不是增加值pb是指向但地址保存在pb。因此它不再指向b的值,而是指向內存中的某個其他值。然後你解引用這個地址並讀取一些隨機值 - 這是你的「垃圾」值。

你可能想要的是增加pb指向的值。所以cout << (*pb + 1)將打印11(注意括號放置在哪裏)。但cout << b仍然會導致10。如果你想真正改變的B您可以做到這一點的價值:

int b = 10; 
int *pb = &b; 
*pb += 1; 
cout << b; 

現在b增加了一個不接觸b本身。