【问题标题】:compiler returns uninitialized value [duplicate]编译器返回未初始化的值[重复]
【发布时间】:2017-03-13 22:31:02
【问题描述】:

我有这个代码:

#include <iostream>

using namespace std;


void funcA()
{
    int a = 4;
}

void funcB()
{
    int b;
    cout << b;
}

int main()
{
    funcA();
    funcB();

    cout << endl;

    return 0;
}

如果我在没有优化的情况下编译它:g++ -o run file.cpp 我收到的结果是:4

如果我用:g++ -O3 -o run file.cpp 编译它,我收到的结果是:0

现在,我希望在这两种情况下

1) funcA 不返回任何内容,因为我们只是调用它,而在 funcA 中我们只是为变量赋值(不返回任何内容)。

2) 从编译器返回关于 funcB 的警告,因为我们没有初始化 b 值。

我发现this answer 更好(更详细)。

【问题讨论】:

  • 这是未定义的行为。你得到的就是你得到的,因为未定义的原因
  • 好吧,未定义的行为是未定义的,因此争论它是毫无用处的。如果需要警告,请启用警告。
  • 现在,我希望在这两种情况下...... -- 不,未定义的行为在你“期望”事情发生的地方不起作用。
  • 感谢您的回答。我现在可以看到问题所在了。(尽管投了反对票,但我无法理解,因为搜索这样的问题很困难(未定义、未指定和实现定义的行为)将此与我的标题进行比较。

标签: c++ compiler-optimization


【解决方案1】:

在 C++ 中,如果您不初始化值,编译器(没有警告标志)不会警告您。

如果你初始化一个变量,你实际做的是分配 x 个字节的数据(在这种情况下很可能是 4 个)。所以即使你不初始化它,也有“东西”。

在这种情况下,它可能会重用之前由a 占用的内存块,这就是您在输出中看到 4 的原因。

如果您使用 -03 标志(最大优化)运行 g++,所有值都将初始化为 0。这就是您在输出中看到 0 的原因。

【讨论】:

  • “如果你运行带有 -03 标志的 g++(最大的优化),所有的值都会被初始化为 0。这就是你在输出中看到 0 的原因。” 那不是真的.
  • 是的,你是对的,g++ 没有将未初始化的值设置为 0 的标志。
  • 在优化设置较高的情况下,编译器可能不会为 funcA 生成代码,因为没有可执行语句。并且看到 funcA 没有任何作用,编译器或链接器可能会消除它。
【解决方案2】:

要获得有用的警告,您必须提出要求。使用 -Wall -Wextra 选项运行 gcc 并感到惊讶。

【讨论】:

  • 好的,谢谢!我看到了!
猜你喜欢
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多