4

想知道 C++ 中未分配整数的值int[]通常是什么。

例子

int arr[5];
arr[1]=2;
arr[3]=4;
for(int i=0;i<5;i++)
{
  cout <<arr[i] <<endl;
}

它打印

-858993460
2
-858993460
4
-858993460

我们知道数组将在{?,2,?,4,?}哪里?是未知的。

“?”会是什么?通常是?

当我测试时,我总是得到负值。我可以假设在 C++ 中整数数组中未分配的元素总是小于或等于零吗?

如我错了请纠正我。当我在 Java 中学习时,数组中未分配的元素会产生 null。

4

6 回答 6

8

形式上,在大多数情况下,尝试读取未初始化的值会导致未定义的行为。因此,从形式上讲,关于实际值的问题是没有实际意义的:您甚至不允许直接查看该值。

实际上,C 和 C++ 中的未初始化值是不可预测的。除此之外,它们不应该是稳定的,这意味着多次读取相同的未初始化值并不能保证读取相同的值。

如果您需要预初始化的本地数组,请使用显式初始化程序声明它

int arr[5] = {};

以上保证用整数零填充数组。

于 2013-07-24T08:16:53.713 回答
1

当我测试时,我总是得到负值。

(以前)未使用的内存空间似乎充满了十六进制代码 0xCC。但是,如上所述——多次——你不能依赖它。

在您的一条评论中,您阐明了您的任务:

我试图创建一个 int 数组,假设大小为 100,并将正整数随机插入数组中的任何位置。如果数组未满。我如何确定数组中的该位置是否从未被分配[?]

用零填充数组(手动或根据 AndrewT 的回答)。由于您只插入正整数,因此您只需要测试!0。

于 2013-07-24T08:45:26.143 回答
0

未初始化的内存区域中包含的值可以是任何值,具体取决于实现。最有效的实现是将内存保持原样,这样您就可以在数组中找到之前包含的任何内容。重要说明:它不是您可以用作随机值的东西。一些实现(我已经看到,尤其是在过去,在调试模式下编译和运行时)可能会在你的内存中放入零,但这种情况并不常见。您根本不应该依赖未初始化内存区域的内容。

要了解您的数组中是否未触及某些内容,您可以将其初始化为一些值,例如 DEADBEEF: http ://en.wikipedia.org/wiki/Hexspeak

(除非您很不幸,您必须插入的值之一与 DEADBEEF 完全对应... :))

于 2013-07-24T08:17:14.363 回答
0

您无法知道这会产生什么,因为它会将当时内存中的位作为值。因此,您可以获得任何值,而不仅仅是负值。

于 2013-07-24T08:18:59.410 回答
0

这些是垃圾值,您不能期望正确使用这些变量,并且它们不会预测它可能导致的结果。每当分配一个变量时,就会为该变量分配一部分内存,并且这些部分之前可能会用于您不知道的其他未知计算,因此您必须使用一些值初始化这些变量以避免使用垃圾值。

于 2013-07-24T08:24:40.187 回答
0

您没有在这些位置分配任何值。所以它会从内存中返回垃圾值。您必须在这些位置放置一些值。未实现的位置将以一些意外/不可预测的值返回。

于 2013-07-24T08:35:15.383 回答