未初始化的本地字符的行为?

Posted

技术标签:

【中文标题】未初始化的本地字符的行为?【英文标题】:Behavior of uninitialized local char? 【发布时间】:2012-10-19 04:21:20 【问题描述】:

如果你有一个未初始化的本地int,那么它会得到一个未定义的值,但是如果你有一个本地的char 变量,它是否也应该没有一个未定义的值?当然 0 可能是那个未定义的值,但我想知道 char 是否有任何不同,因为我找到的所有相关信息都是关于 int 并且当 char 变量转换为 int 时,下面的程序只输出 0。我使用没有标志的 GCC 4.7。

int main()

char test1;
int test2;

std::cout<<test2; //garbage
std::cout<<std::endl;
std::cout<<(int)test1; //0
    return 0;

【问题讨论】:

对于内置类型,您未初始化的本地包含未指定的值。使用它会产生未定义的行为。 我一直get 8,这就像一直得到0一样毫无意义。 @underscore_d 您无法区分 charunsigned char 【参考方案1】:

未初始化意味着真正未初始化。仅仅因为您在特定时间在您的机器上始终获得特定值,并不意味着在所有机器上总是如此。

您可以通过转储函数的汇编代码并检查它来验证没有初始化变量。

【讨论】:

【参考方案2】:

如果你让我们说一个未初始化的本地 int,那么它会得到一个未定义的值

不,这不是正确的思考方式。您的局部变量没有得到未定义的值,它没有任何值。随后查询这样一个未初始化的变量会调用未定义的行为

您的程序不一定会打印“0”。它不一定会打印任何数字,甚至任何东西。当然,在典型的计算机上,使用典型的编译器,您的程序会打印一些数字,但在 C++ 语言的范围内,我们无法对您的程序将做什么或不做什么做出任何预测。

【讨论】:

【参考方案3】:

局部变量从它们当时占用的堆栈空间中的任何随机数据中获取初始值。不能保证空格包含零。

【讨论】:

虽然在实践中确实如此,但 C++ 标准中并没有要求这种行为。未定义的行为实际上意味着“任何事情都可能发生”。 @Remy Lebeau 这样简洁准确的评论才是像我这样的“新手”真正需要的:-)

以上是关于未初始化的本地字符的行为?的主要内容,如果未能解决你的问题,请参考以下文章

如果 a 未初始化,a^a 或 a-a 是未定义的行为吗?

动态数组的惯用初始化是不是会调用未定义的行为?

C++/Win32 构造函数未使用从对话框获得的字符串初始化变量

未使用的默认成员初始化器如何改变 C++ 中的程序行为?

是否在空的初始化程序列表(并明确指定类型)上调用 std::min 未定义的行为?

在未初始化的对象(空指针)上调用方法