我已经为5个元素的数组动态分配了内存,然后尝试将其元素打印到std::cout
,这应该给我带来相当简单的结果。相反,我还有别的东西,这让我有些疑问。
我的代码:
#include <iostream>
int main()
{
int *array = new int[5];
int array_size = sizeof(array);
for (int index = 0; index < array_size; index++) {
std::cout << array[index] << "\n";
}
std::cout << "\nThe array is " << array_size << " elements long.";
return 0;
}
这就是结果:
0
0
0
0
0
0
132049
0
现在,我知道这不是事情的完成方式,但是这样的结果使我有几个问题。
答案 0 :(得分:5)
您的代码有两个问题,每个问题都会导致未定义的行为。
首先,sizeof(array)
是指针的大小(以字节为单位),而不是数组。在您的计算机上,指针恰好占用8个字节。这会导致超出范围的访问,这是未定义的行为。
第二,new int[5]
为您提供了未初始化的数组。访问未初始化对象的值是未定义的行为。
要解决这些问题,请首先注意new
返回的数组的大小会丢失。 sizeof
无法帮助您。您只能自己提供此信息。然后,您必须初始化元素。
#include <iostream>
int main()
{
int *array = new int[5]{}; // note: initialization
int array_size = 5;
for (int index = 0; index < array_size; index++) {
std::cout << array[index] << "\n";
}
std::cout << "\nThe array is " << array_size << " elements long.";
return 0;
}
这是保证可以打印的代码
0
0
0
0
0
The array is 5 elements long.
(只要有足够的内存并且输出成功)