【问题标题】:printf() seems to change a variableprintf() 似乎改变了一个变量
【发布时间】:2017-11-20 09:18:07
【问题描述】:

我是一名 cpp 初学者,无法理解为什么在以下代码中,printf()... 函数似乎更改 一些变量。代码有问题,还是我的编译器安装有问题?

#include <iostream>
#include<stdio.h>

class Node
{
public:
    int val;
    Node * next;

    Node(int v) { // constructor
        val=v;
        next=NULL;
    }
};

class Stack
{
public:
    Node *head;
    Stack(int i) // constructor
    {
        Node n(i);
        head=&n;
    }
};

int main() 
{
    Stack s(1);
    printf("s.head->next: %p\n",s.head->next);
    printf("s.head->next: %p\n",s.head->next);
}

我得到以下输出:

s.head->next: 00000000
s.head->next: FFFFFFFE

我怎么可能不一样? (我在使用 std:cout 函数时遇到了类似的问题,但最少的代码会更长)。 感谢您的反馈。

【问题讨论】:

  • 使用 std::cout 代替 printf。
  • @manni66 我试过了,但问题还是在某个时候出现了

标签: c++


【解决方案1】:

这个:

  Node n(i);

创建一个局部变量,然后您可以存储以下地址:

  head=&n;

稍后再使用该地址。

在那之后,所有的赌注都被取消了,因为你处于未定义的行为领域。

【讨论】:

  • 感谢您的反馈!我怀疑这是错误的。然而,即便如此,printf() 函数是否有可能不以确定性方式运行?
  • 一个程序一旦进入 UB 领域,推理它是没有用的。根本不要去那里。
  • @PeterFranek 就像 Neil 所说,你所做的是完全未定义的行为。这可能会抹去你的 DD,在时空中创建一个新维度,或者在火星上寄钱。 en.cppreference.com/w/cpp/language/ub
  • @PeterFranek:正在发生的事情是printf 将堆栈用于自己的目的(它完全有权这样做)。它在head 指向的地址有自己的数据,它正在覆盖它。
猜你喜欢
  • 2012-10-10
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-15
  • 2020-10-15
  • 1970-01-01
相关资源
最近更新 更多