如何在 c++ 中为数组分配大小?

How size is allocated in c++ for array?

本文关键字:分配 数组 c++      更新时间:2023-10-16

如果我们用 4 个元素初始化数组,例如:

int array[4];

我们可以像这样分配值吗,因为它也需要 4 个值:

for(int i=5;i<9;i++){    
cin>>array[i];
}

数组上的越界访问具有未定义的行为,这是"意外后果"的另一种说法:

int a[4];
int b[4];
for(int i=5;i<9;i++){
a[i] = i;
}

在调试器中观察它正在做什么,特别是观察b发生了什么。

这可能会也可能不会崩溃,但它仍然是损坏的代码。C++不会总是提醒您这种情况,但作为开发人员,您有责任了解访问某些结构时允许和不允许的内容。

越界访问数组并不总是会导致崩溃,但总是有问题的。尝试使用i = 999999i = -9,看看会发生什么。

未定义行为的问题在于,它可能看起来有效,但这些意想不到的后果最终会赶上你。这使得调试代码变得非常困难,因为这种越界写入可能会在初始错误发生几分钟或几小时后踩到其他地方需要的变量,然后程序崩溃。这些类型的错误是最令人愤怒的,因为因果关系之间的时间非常长。

这就像在垃圾桶里扔点燃的火柴可能不会每次都引起火灾一样,但是当它确实引起火灾时,你可能直到为时已晚才注意到。在C++你必须非常警惕,不要在代码中引入未定义的行为。

您混合了两个构造 - 用于循环迭代的逻辑和数组的索引。

您可以使用

for(int i=5;i<9;i++){
...
}

运行循环四次。但是,许多人不使用这些i值来访问数组。数组索引必须适当偏移,使其有效。

for(int i=5;i<9;i++){
int index = i - 5;
std::cin >> array[index];
}

不,你会得到一个有 4 个插槽的数组。这些插槽是

array[0]
array[1]
array[2]
array[3]

所以你的代码不正确。它似乎有效,但由于所谓的未定义行为,它仍然是错误的,下周它可能会失败

注意。你最好在 c++ 中使用 std::vector

我们可以像这样分配值吗,因为它也取了 4 个值:

for(int i=5;i<9;i++){
cin>>array[i];

不,我们不能。由于数组的大小为 4,因此可以访问的唯一索引是 0、1、2 和 3。访问任何其他索引将具有未定义的行为。

尝试在它

正在工作的任何在线编译器中运行它。

行为未定义。可能的行为包括,其中没有一个是保证的:

- working
- not working
- random output
- non-random output
- the expected output
- unexpected output
- no output
- any output
- crashing at random
- crashing always
- not crashing
- corruption of data
- different behaviour, when executed on another system
-                    , when compiled with another compiler
-                    , on tuesday
-                    , only when you are not looking
- same behaviour in all of the above cases
- anything else within the power of the computer (hopefully limited by the OS)