我试图在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
有三件事我不明白:
答案 0 :(得分:1)
a
,b
,c
,d
和*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
这样的指针,在内存中占用相同的空间。