【发布时间】:2012-09-15 05:04:53
【问题描述】:
在C++中,当你动态分配int的数组时,ints的值是未定义还是初始化为0?
int *array = new int[50];
【问题讨论】:
-
总是垃圾;什么都留在那里。
在C++中,当你动态分配int的数组时,ints的值是未定义还是初始化为0?
int *array = new int[50];
【问题讨论】:
术语未初始化。但这取决于您如何初始化数组。你可以对它进行值初始化:
int *array = new int[50]();
值将是 0。
如果你让它未初始化,你就无法知道那里有什么值,因为读取它们是未定义的行为。
【讨论】:
如果你使用向量而不是数组,你会得到所有元素的初始值 0:
std::vector<int> v(50);
如果你想要一个不同的默认值,你可以指定一个:
std::vector<int> v(50, 42);
向量的另一个好处是您不必手动释放底层数组。
【讨论】:
vector 之类的:)
回答你的问题没有。但是有一种方法可以设置默认值。 试试:
int *arr = new int[SIZE]() ;
以上是 C++ 标准,但可能不适用于所有编译器。安全的选择是使用循环并将其初始化为您选择的默认值。
for(int i=0; i < SIZE; i++)
{
arr[i] = 1; //1 being my default value
}
编辑: 正如其他人指出的更好:memset
【讨论】:
它们将是未定义的。只是垃圾,具体取决于初始化之前这些位置的内容
【讨论】:
如果你写
int *array = new int[50];
那么数组中的值可以包含任何东西,但如果你写
int *array = new int[50]();
然后你将调用“默认构造函数”,一切都将是 0。
【讨论】:
它们更近,它们包含分配之前的所有数据。
【讨论】:
在 C/C++ 中,在内存中分配一个对象意味着简单地为该对象保留一些内存块。 初始值基本上是那些块中存在的大部分时间随机值。
【讨论】:
您需要假设它是垃圾,即使它可能经常(尤其是在调试版本中)被初始化为零或其他一些预定义的值,指示未初始化的内存(如果不使用零,通常是一些 HexSpeak 值)。
例如见http://www.nobugs.org/developer/win32/debug_crt_heap.html#table
【讨论】:
标准完全没有定义它,实际上只取决于您的操作系统和编译器。在一些编译器中,它只是使用操作系统给你的任何东西,而在一些操作系统中,它会是 0,其他是垃圾,还有一些是其他东西。或者编译器可以在malloc 或new 之后自动插入一个不可见的memset。但无论如何,重点是,永远不要依赖价值。即使您当前版本的编译器将其设为 0,例如,这可能会在未来版本中发生变化,并且在另一个编译器上可能不会如此。
【讨论】: