【问题标题】:why "cout" prints variables in wrong order [duplicate]为什么“cout”以错误的顺序打印变量[重复]
【发布时间】:2021-09-06 07:41:37
【问题描述】:

以下代码:

int main(){

  int a;
  int b;
  int c=0;
  int *p;

  p=&a;
  *p = 10;
  *(p+1) = 20;
  *(p+2) = 30;

  cout << a << " " << b << " " << c << endl;
 
  return 0;
}

给出输出:

10 30 20

解释? 如果 c 未初始化 (int a,b,c;) 预期结果:10 20 30

【问题讨论】:

  • 这是未定义的行为。 “为什么”这个问题没有任何意义。
  • 你有未定义的行为!你让p指向单个变量a。这意味着p + 1p + 2超出范围
  • 至于实际发生的情况,不能保证您的编译器会按照声明的顺序存储变量。甚至按递增顺序。甚至它们甚至存储在某种“堆栈”中。
  • 这个问题应该有一个规范的副本...
  • if 随机行代码 cout -- 未定义的行为是未定义的。当我在 Visual C++ 中以调试模式运行您的程序时,会引发运行时异常。所以问问你自己——你值得花时间尝试用糟糕的代码玩花样,还是花时间学习正确的 C++ 编程?

标签: c++ pointers


【解决方案1】:

这是完全未定义的行为。指针运算只允许在单个数组内部(甚至在结构成员之间,尽管一些编译器可能会容忍后者)。局部变量不构成数组。它们可能在内存中有任意位置。

【讨论】:

  • cout
  • @sone13 -- 你没有理解所提出的观点。你读过主要部分的 cmets 吗?
  • @sone13 今天可能会显示连续的地址,明天可能会显示一些随机地址。 Undefined 是未定义的,它可能会按预期工作,或者尝试格式化您的 HDD,或者做其他任何事情。
  • cout &b 和 p+1 ,结果相同
  • @sone13 请检查this page on cppreference 未定义的行为。简而言之:无论您观察或认为要观察什么,您的程序都是错误的,并且任何事情都可能发生。对此进行推理或期望任何特定的输出是没有任何意义的。
【解决方案2】:

您已经假设 *(p+1) 是 b。没有理由永远如此。编译器如何为变量分配内存地址是完全未定义的,并且会根据许多不同的因素而有很大差异(在您的示例中,早期初始化变量会改变它。另一个会改变它的重要事情是编译器优化)。你真的不应该依赖相对的内存位置。

【讨论】:

    【解决方案3】:

    指针 (p+1) 不指向整数变量 b,指针 (p+2) 不指向变量 c。因此,当您计算这些变量时,您会得到模糊的值。而是尝试使用数组,因为在初始化数组时,编译器会为数组分配连续的内存。但是当你声明变量时,编译器不会分配连续内存

    Int a[3];
    Int *p;
    p = &a;
    *p = 10;
    *(p+1) = 20;
    *(p+2) = 30;
    cout<< a[0] <<a[1] <<a[2] ;
    

    【讨论】:

    • 如果 cout &b 和 p+1 ,结果是相同的
    • @sone13 同样,当我尝试编译您的程序时没有任何结果,即使这样,运行您的程序也会崩溃。我不知道你试图通过让错误的代码“行为”来完成什么。
    • 如果变量“b”的地址和指针p+1中的地址相同。然后 *(p+1) 计算整数变量 b 中的值。但是,指针“p”没有必要仍然指向整数“a”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 2014-10-14
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多