在 C++ 中,当您动态分配 的数组时int
, s 的值是int
未定义的还是初始化为 0?
int *array = new int[50];
该术语未初始化。但这取决于您如何初始化数组。您可以对其进行值初始化:
int *array = new int[50]();
并且值为0。
如果你让它未初始化,你就无法知道那里有什么值,因为从它们中读取将是未定义的行为。
如果您使用向量而不是数组,您将获得所有元素的初始值 0:
std::vector<int> v(50);
如果你想要一个不同的默认值,你可以指定一个:
std::vector<int> v(50, 42);
向量的另一个好处是您不必手动释放底层数组。
回答你的问题没有。但是有一种方法可以设置默认值。尝试:
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,其他是垃圾,还有一些是其他东西。memset
或者编译器可以在 amalloc
或之后自动插入一个不可见的new
。但无论如何,重点是,永远不要依赖价值。即使您当前版本的编译器将其设为 0,例如,这可能会在未来版本中发生变化,并且在另一个编译器上可能不会如此。