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

4
如果你有一个未初始化的本地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;
}

对于内置类型,未初始化的本地变量包含未指定的值。使用它会导致未定义的行为。 - Jerry Coffin
1
我一直得到8分,这和一直得到0分一样毫无意义。 - Praetorian
1
@underscore_d,您未能区分charunsigned char - M.M
3个回答

4

未初始化意味着真的没有初始化。仅仅因为在你的机器上在某个特定时间你始终得到一个特定的值,并不意味着在所有机器上始终如此。

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


3
如果你有一个未初始化的本地int,那么它会得到一个未定义的值。不,这不是正确的思考方式。你的本地变量没有得到一个未定义的值,它根本就没有得到任何值。随后查询这样一个未初始化的变量会调用未定义的行为。你的程序不一定会打印“0”。它不一定会打印任何数字,甚至什么都不会打印。当然,在典型的计算机上,使用典型的编译器,你的程序会打印出一些数字,但在C++语言范畴内,我们无法对你的程序做任何预测或不预测。

2

局部变量的初始值来自它们所占用的堆栈空间中的任意随机数据。不能保证该空间包含零。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接