gpt4 book ai didi

c++ - 为什么在 ubuntu linux 的 c++ 的 g++ 编译器中局部变量被初始化为 0?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:19:39 26 4
gpt4 key购买 nike

根据任何有关 C++ 的书籍,任何未初始化的 C++ 局部变量都将包含垃圾值。但是,请查看以下程序:

#include<iostream>
using namespace std;
float a;
class A
{
public:
float b;
};
int main()
{
float c;
static float d;
static float e = 0;
A f;
cout<<"\n global a : "<<a<<"\n class variable b : "<<f.b;
cout<<"\n local c : "<<c<<"\n static local d : "<<d
<<"\n static initialized local e : "<<e;
}

如果在 ubuntu linux 上使用 g++ 编译,它会给出以下输出:

global a : 0
class variable b : 6.94896e-36
local c : 0
static local d : 0
static initialized local e : 0

奇怪的是它为局部变量 c 赋予了 0 值,而这应该是未初始化的并且包含一些垃圾值。同一程序在 visual c++ for windows 中的工作方式不同,并为 c 提供垃圾值,这正是您所期望的。

最佳答案

局部变量 c 未初始化。这意味着,如您所说,它有一个垃圾值。该对象可以有任何值,包括0。零是有效的“垃圾值”。一般情况下,不允许读取未初始化的对象。

为什么 c 的值为零?可能是编译器 (g++) 在输入函数时对堆栈进行零初始化,以“帮助”您的程序“正确”执行,即使它使用了未初始化的变量。或者,可能是操作系统在将内存页提供给您的程序之前对内存页进行了零初始化。或者,也许在 main 之前调用的函数将值零存储在现在由 c 占用的字节数组中,因此它具有零值。


使用 Visual C++ 编译的二进制文件的行为取决于它的编译方式。在发布二进制文件中,性能比可调试性更重要,当函数进入时堆栈不会隐式初始化,因此 c 将保持未初始化状态,并具有垃圾值。

在调试二进制文件中,可调试性更为重要,所有局部变量都使用字节 0xcc 进行初始化。这可以帮助您跟踪和调试未初始化变量的使用。类似地,调试堆使用字节 0xcd 初始化新分配的存储,并用 different bit patterns 填充内存。在分配和释放时,帮助您调试程序的状态。

关于c++ - 为什么在 ubuntu linux 的 c++ 的 g++ 编译器中局部变量被初始化为 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11143354/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com