未初始化的变量可能具有未定义的值,但该未定义的值是否具有相同的数据类型?

时间:2015-08-24 06:56:26

标签: c types

假设我们在C:

中声明
int a;

它的值未定义(让我们忘记那些默认设置为零的编译器)。但是这个未定义的值是否仍然具有变量的数据类型(整数)?

可能是a=19382a=23a=-33332 ...但不是a=33.2

这对我来说听起来很合乎逻辑,但不确定。

4 个答案:

答案 0 :(得分:5)

由于你没有初始化它,虽然a将消耗与初始化int相同的内存量,但内容是不确定的。

编译器必须将其视为int,因此它可以具有任何整数值。它不能是33.2,因为它不是int。但是,在某些架构中,它可能会包含一个“陷阱值”'这会在您尝试访问“a”时导致错误。另外,我无法想到int的任何示例,尽管浮点数确实具有称为'信令NANs'如果你尝试将无效指针加载到地址寄存器中,一些架构会陷阱。

答案 1 :(得分:4)

当它归结为任何变量的按位表示时,通过查看该级别,您无法判断它是intfloat还是其他任何变量。这就是为什么需要变量的关联数据类型来理解和表示类型。

因此,当变量具有不确定值时,它是不确定的。它是否与变量的类型相同,没有多大意义,恕我直言。

只是为了说明一点(严格来说不是),你没有办法检查未初始化变量的值,因为,试图使用( read)该值将生成undefined behaviour

答案 2 :(得分:2)

该值未定义,因此使用它是未定义的行为。它可能int,但它也可能有一个不是int的合法代表的位模式。

在实践中,它不太可能具有int的合法表示的位模式,但并不能保证您对此有所了解。

永远不会 类型,因为您提供的类型决定了如何解释存储的位模式。

答案 3 :(得分:0)

如果在函数之外声明普通的int,它将被初始化为0.这是由C标准保证的,并且如果你的编译器(实际上是编译器链接它的运行时库)没有将它设置为零,那它有一个seroius错误。

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf第6.7.9节第10段。

如果它在函数内部声明,它将具有不确定的值,并且访问它可能会导致可怕的未定义行为。