2017-01-10 5 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; 

} 

出力である:

C = 0

0x7ffefad88d00 = 124

0x7ffefad88d04 B = 0

0x7ffefad88d08 0x7ffefad88d10 c2 = 0x 400b20

0x7ffefad88d18 D = 0xec9c20

私は理解していない3つの事があります。値が124である理由

  1. は?
  2. なぜc値が0で、同じ構文を持つc2のようなポインタではないのですか?
  3. なぜCサイズは4バイトではなく2バイトですか?
+0

'a'とtriyを初期値に設定していないので、これは未定義の動作です。何かが起こる可能性があります。 'int'のサイズは、コンパイラによって異なります。 – doctorlove

+0

ありがとう、しかし、私はまだbをinitialised didnt ...なぜ彼はcomplier値を得るdidnt? – 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サイズが4バイトではないのですか?

cポインタのサイズはアーキテクチャおよび/またはコンパイラによって異なります。この場合、cは占有8バイトです。 c2のアドレスからcのアドレスを減算します。

0x7ffefad88d10 - 0x7ffefad88d08 = 0x000000000008これらは10進数ではない16進数値です。

したがって、cは実際にはc2のようなポインタであり、メモリ内の同じ領域を占有します。