4

在 C++ 中,当您动态分配 的数组时int, s 的值是int未定义的还是初始化为 0?

    int *array = new int[50];
4

9 回答 9

8

该术语未初始化。但这取决于您如何初始化数组。您可以对其进行值初始化

int *array = new int[50]();

并且值为0。

如果你让它未初始化,你就无法知道那里有什么值,因为从它们中读取将是未定义的行为。

于 2012-09-23T14:35:46.033 回答
6

如果您使用向量而不是数组,您将获得所有元素的初始值 0:

std::vector<int> v(50);

如果你想要一个不同的默认值,你可以指定一个:

std::vector<int> v(50, 42);

向量的另一个好处是您不必手动释放底层数组。

于 2012-09-23T15:08:08.850 回答
4

回答你的问题没有。但是有一种方法可以设置默认值。尝试:

int *arr = new int[SIZE]() ;

以上是 C++ 标准,但可能不适用于所有编译器。安全的选择是使用循环并将其初始化为您选择的默认值。

for(int i=0; i < SIZE; i++)
{
  arr[i] = 1; //1 being my default value
}

编辑:正如其他人指出的更好: memset

于 2012-09-23T14:36:10.807 回答
2

它们将是未定义的。只是垃圾,具体取决于初始化之前这些位置的内容

于 2012-09-23T14:34:15.760 回答
2

如果你写

int *array = new int[50];

那么数组中的值可以包含任何东西,但是如果你写

int *array = new int[50]();

那么你将调用“默认构造函数”,一切都将是 0。

于 2012-09-23T14:41:59.123 回答
0

它们更近,它们包含分配之前存在的任何数据。

于 2012-09-23T14:34:02.993 回答
0

在 C/C++ 中,在内存中分配一个对象意味着简单地为该对象保留一些内存块。初始值基本上是那些块中存在的大部分时间随机值。

于 2012-09-23T14:35:13.957 回答
0

您需要假设它是垃圾,即使它可能经常(尤其是在调试版本中)被初始化为零或其他一些预定义的值指示未初始化的内存(如果不使用零,通常是一些HexSpeak值)。

例如参见http://www.nobugs.org/developer/win32/debug_crt_heap.html#table

于 2012-09-23T14:35:35.417 回答
0

标准完全未定义它,实际上仅取决于您的操作系统和编译器。在一些编译器中,它只是使用操作系统给你的任何东西,而在一些操作系统中,它会是 0,其他是垃圾,还有一些是其他东西。memset或者编译器可以在 amalloc或之后自动插入一个不可见的new。但无论如何,重点是,永远不要依赖价值。即使您当前版本的编译器将其设为 0,例如,这可能会在未来版本中发生变化,并且在另一个编译器上可能不会如此。

于 2012-09-23T14:51:36.187 回答