【问题标题】:Keeping/removing cout statements causing output to change in c++保留/删除 cout 语句导致输出在 C++ 中发生变化
【发布时间】:2021-06-05 20:19:34
【问题描述】:

考虑这段代码 -

#include<bits/stdc++.h>

using namespace std;

struct node{
    char symbol;
    node * left = NULL;
    node * right = NULL;
};


node * somefn(node *ptr){
    node temp;
    node temp2;
    temp.left = &temp2;
    temp.symbol = 'b';
    ptr = &temp;
    return ptr;
}

int main(){
    node *ptr;
    ptr = somefn(ptr);

    cout<<(ptr->symbol)<< "\n"; // this statement
    if(ptr->left->left != NULL) cout<<"this shldnt print";
    return 0;

}

当我执行这个保留第一个 cout 语句时,我得到输出 -

b
this shldnt print

但是,当删除第一个 cout 语句时,不会打印任何内容(第二个 cout 也不会)。为什么会出现这种不一致的行为? 我正在使用 gcc 版本 5.4.0。我什至在在线 ide 上尝试过这段代码,但同样的事情也发生了。

【问题讨论】:

  • somefn 返回一个指向已被销毁的局部变量的悬空指针。通过访问生命周期已结束的对象,您的程序会表现出未定义的行为。
  • temp.left = &amp;temp2; 是一个错误,ptr = &amp;temp; 也是一个错误,当函数结束时,这两个对象都不再存在,但是您返回一个指向不存在对象的指针。

标签: c++ pointers null void-pointers


【解决方案1】:

您的代码存在多个问题,特别是 somefn()。首先,这不是指针的工作方式,您需要在 somefn() 中动态创建“节点”实例。 “temp”和“temp2”是局部变量,当函数返回时它们超出范围,这意味着节点实例是在堆栈上创建的,并且在 somefn() 之外“不再可用”。 C++ 将此指定为“未定义的行为”,也就是任何可能发生的情况。

其他问题是您应该使用“#include”来引入 std::cout(“bits/”不是标准的,听起来像一些内部目录),虽然在 C++ 中技术上没有错误,但您应该使用“nullptr”(或“ 0") 而不是 NULL。

【讨论】:

  • 谢谢@demeter!我想知道,除了动态分配之外,还有什么方法可以创建实例(并且在函数返回后不会松开它们)?另外我不想返回节点对象本身(复制需要时间,对吧?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
  • 2020-03-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多