C++/是否允许更改静态数组的大小

C++ / Is it allowed to change size of an static array or not?

本文关键字:数组 静态 许更改 是否 C++      更新时间:2023-10-16

根据C++中静态数组与动态数组的正确答案,静态数组具有固定的大小。

然而,这编译和运行都很好:

int main(int argc, char** argv) {
int myArray[2];
myArray[0] = 0;
myArray[1] = 1;
cout<<myArray[0]<<endl;
cout<<myArray[1]<<endl;
myArray[4];
myArray[2] = 2;
myArray[3] = 3;
cout<<myArray[2]<<endl;
cout<<myArray[3]<<endl;
return 0;
}

这是否意味着可以调整静态数组的大小?

您实际上并没有放大数组。让我们详细了解您的代码:

int myArray[2];
myArray[0] = 0;
myArray[1] = 1;

创建一个由两个位置组成的数组,索引从0到1。到目前为止,一切都很好。

myArray[4];

您正在访问数组中的第五个元素(该元素肯定不存在于数组中)。这是未定义的行为:任何事情都可能发生。你没有用这个元素做任何事情,但这并不重要。

myArray[2] = 2;
myArray[3] = 3;

现在您正在访问元素三和元素四,并更改它们的值。同样,这是未定义的行为。您正在更改创建的数组附近的内存位置,但";什么都没有";。数组保持不变。

实际上,您可以通过以下操作检查阵列的大小:

std::cout << sizeof( myArray ) / sizeof( int ) << std::endl;

您将检查数组的大小是否没有更改。顺便说一句,这个技巧在声明数组的同一个函数中有效,只要你把它传递出去,它就会衰减为指针。

在C++中,不检查数组的边界。您没有收到任何错误或警告,主要是因为这一点。但是,访问超出数组限制的元素是未定义的行为。未定义的行为意味着这是一个可能的错误。它不会立即出现(表面上是好的,但实际上不是)。即使是程序显然也可以毫无问题地结束。

不,地狱里没有机会。你所做的只是在它的边界之外非法访问它。事实上,这恰好不会给你带来错误,这是完全无关的。它完全是UB。

首先,这不是一个静态数组,它是在自动存储中分配的数组。

接下来,

myArray[4];

不是一个新声明,它是从先前声明的2元素数组的元素#4中丢弃的读取,这是一个未定义的行为。

之后的分配

myArray[2] = 2;
myArray[3] = 3;

写入未分配给程序的内存,这也是一种未定义的行为。