获得指针和常规int的奇怪值

时间:2017-01-10 15:42:55

标签: c++ c++11 compilation stack heap

我试图在c ++上学习堆栈和堆,然后开始打印测试以了解它是如何工作的。

我写了这段代码:

`#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 a = 124

     

0x7ffefad88d04 b = 0

     

0x7ffefad88d08 c = 0

     

0x7ffefad88d10 c2 = 0x400b20

     

0x7ffefad88d18 d = 0xec9c20

有三件事我不明白:

  1. 为什么值为124?
  2. 为什么c值为0而不是像c2这样具有相同语法的指针?
  3. 为什么c大小只是2个字节而不是4个?

2 个答案:

答案 0 :(得分:1)

abcd*d的值未初始化,阅读它们为undefined behavior。任何事情都可能发生,任何人都无法预测这些变量的价值。有关详细信息,请参阅this question

关于指针的打印输出,许多实现修剪前导0。见this question。如果我尝试在Visual Studio 2015中打印出指针的值,我会得到前导零。

答案 1 :(得分:0)

  

为什么值为124?

a未初始化,因此阅读它会给你不可预测的价值。读取未初始化的非静态局部变量是UB。但是,未初始化的全局变量和静态变量在编译时用0初始化并且读取它们很好。

  

为什么c值为0而不是像c2那样具有相同语法的指针?

c也未初始化,所以它指向的内容也未定义,如上所述。它是一个像c2这样的指针,但它指向NULL(为0)。

  

为什么c大小只有2个字节而不是4?

指针的

c大小取决于体系结构和/或编译器。在这种情况下,c占用了8个字节。从c的地址中减去c2的地址。

0x7ffefad88d10 - 0x7ffefad88d08 = 0x000000000008这些是十六进制值而不是十进制。

因此,c实际上是一个像c2这样的指针,在内存中占用相同的空间。