【问题标题】:getting strange values for pointer and a regular int获取指针和常规 int 的奇怪值
【发布时间】:2017-01-10 15:42:54
【问题描述】:

我正在尝试学习 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

有 3 件事我不明白:

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

【问题讨论】:

  • 由于您尚未初始化 a 并尝试打印其值,这是未定义的行为 - 所以任何事情都可能发生。 int 的大小因编译器而异。
  • 谢谢,但我也没有初​​始化 b...为什么他没有得到编译器值?
  • 0 是一个完全可以接受的随机数
  • 好的。谢谢... c 呢?你知道为什么会这样吗?

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


【解决方案1】:

abcd*d 的值是未初始化的,读取它们是undefined behavior。任何事情都可能发生,没有人可以预测这些变量的值。请参阅this question 了解更多信息。

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

【讨论】:

【解决方案2】:

为什么值是 124?

a 未初始化,因此读取它会给你带来不可预知的价值。读取未初始化的非静态局部变量是UB。但是,未初始化的全局变量和静态变量在编译时被初始化为 0,读取它们就可以了。

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

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

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

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

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

所以,c 实际上是一个类似c2 的指针,并且在内存中占用相同的空间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多