2017-01-10 29 views
0

我想了解堆棧和堆在c + +和剛開始打印測試,以瞭解它是如何工作的。得到奇怪的值的指針和一個普通的int

我寫這個代碼:

`#include <iostream> 

using namespace std; 

int main(){ 

int a; 
int b; 
int *c; 
int *c2; 
int *d{new int}; 

cout << &a << " a= " << a << endl; 
cout << &b << " b= " << b << endl; 
cout << &c << " c= " << c << endl; 
cout << &c2 << " c2= " << c2 << endl; 
cout << &d << " d= " << d << endl; 

delete d; 

return 0; 

} 

輸出爲:

0x7ffefad88d00一個= 124

0x7ffefad88d04 B = 0

0x7ffefad88d08 C = 0

0x7ffefad88d10 c2 = 0x 400b20

0x7ffefad88d18 d = 0xec9c20

有三件事情我不明白:

  1. 爲什麼值124?
  2. 爲什麼c值是0而不是像c2這樣的指針具有相同的語法?
  3. 爲什麼c大小隻是2個字節而不是4個?
+0

由於您尚未初始化'a'和triy來打印其值,因此這是未定義的行爲 - 因此可能發生任何事情。 int的大小因編譯器而異。 – doctorlove

+0

謝謝,但我沒有初始化b以及...爲什麼他沒有得到編譯器的價值? – adi319

+0

0是一個完全可以接受的隨機數 – doctorlove

回答

1

abcd*d值是未初始化,讀取它們是undefined behavior。任何事情都可能發生,沒有人能夠預測這些變量的價值。有關更多信息,請參見this question

關於指針的打印輸出,許多實現修剪前導0。請參閱this question。如果我嘗試在Visual Studio 2015中打印出指針的值,我會得到前導零。

+0

謝謝。我同意這一部分,但與C?它被認爲是一個指針.... – adi319

+0

而且? http://stackoverflow.com/questions/7546620/operator-new-initializes-memory-to-zero – doctorlove

0

爲什麼值是124?

a未初始化,因此閱讀它會給你不可預知的價值。讀取未初始化的非靜態局部變量是UB。但是,未初始化的全局變量和靜態變量在編譯時使用0進行初始化,並且讀取它們很好。

爲什麼c值是0而不是像c2這樣的指針具有相同的語法?

c也未初始化,所以它指向的也是未定義的,如上所述。它是一個像c2這樣的指針,但它指向NULL(它是0)。

爲什麼c大小隻是2個字節而不是4?

c指針的大小是架構和/或編譯器相關的。在這種情況下,c佔用8個字節。從地址c2中減去c的地址。

0x7ffefad88d10 - 0x7ffefad88d08 = 0x000000000008這些是十進制值不是十進制。

因此,c實際上是一個像c2一樣的指針,並佔用內存中的相同空間。