在C ++中,当您动态分配int
数组时,int
的值是否未定义或初始化为0?
int *array = new int[50];
答案 0 :(得分:7)
这个词是未初始化。但这取决于你如何初始化数组。您可以对其进行初始化:
int *array = new int[50]();
,值为0。
如果你没有初始化它,你就无法知道它们的值是什么,因为从中读取它们将是未定义的行为。
答案 1 :(得分:6)
如果使用向量而不是数组,则所有元素的初始值均为0:
std::vector<int> v(50);
如果您需要不同的默认值,可以指定一个:
std::vector<int> v(50, 42);
向量的另一个好处是您不必手动释放基础数组。
答案 2 :(得分:3)
回答你的问题。但是有一种方法可以设置默认值。 尝试:
int *arr = new int[SIZE]() ;
以上是C ++标准,但可能不适用于所有编译器。安全的赌注是使用循环并将其初始化为您选择的默认值。
for(int i=0; i < SIZE; i++)
{
arr[i] = 1; //1 being my default value
}
编辑: 正如其他人指出的更好:memset
答案 3 :(得分:2)
他们将是未定义的。在初始化之前,只需要根据这些位置的内容进行垃圾处理
答案 4 :(得分:1)
如果你写
int *array = new int[50];
然后数组中的值可以包含任何内容,但是如果你写了
int *array = new int[50]();
然后你将调用“默认构造函数”,一切都将为0。
答案 5 :(得分:0)
它们更新,它们包含分配前的任何数据。
答案 6 :(得分:0)
在C / C ++中,在内存中分配对象意味着只需为该对象保留大量内存块。 初始值基本上是那些块中存在的大部分时间随机值。
答案 7 :(得分:0)
你需要假设它是垃圾,即使它可能经常(特别是在调试版本中)被初始化为零或某个其他预定义值指示未初始化的内存(如果不使用零,通常是一些HexSpeak值)。
E.g。见http://www.nobugs.org/developer/win32/debug_crt_heap.html#table
答案 8 :(得分:0)
标准完全没有定义,实际上只取决于您的操作系统和编译器。在一些编译器中,它只使用操作系统给你的任何东西,在一些操作系统中将为0,其他操作系统为垃圾,其他操作系统为其他操作系统。或者编译器可以在memset
或malloc
之后自动插入不可见的new
。但无论如何,重点是,永远不要依赖价值。即使你的编译器的当前版本使其为0,比如说,在将来的版本中可能会改变,而在另一个编译器中可能不会这样。