C++/是否允许更改静态数组的大小
C++ / Is it allowed to change size of an static array or not?
根据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;
写入未分配给程序的内存,这也是一种未定义的行为。
相关文章:
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 静态数组的自由动态数组
- 如何在C++函数中声明静态 2D 数组?
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 基于字节数组生成静态范围整数值
- 如何在C++中删除静态数组?
- 为什么 &a 和 c++ 中的静态数组相同?
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 将在堆栈上声明的元素添加到静态数组
- const_cast静态数组以添加恒常性
- C++访问静态 constexpr 数组
- 初始化类中的静态 const 数组 - C++
- 将静态字符数组中的字符分配给动态分配的字符数组 - 访问冲突
- 动态分配的数组和静态数组之间的区别
- 如何在 C++ 中使用 NULL(或 0)初始化静态字符数组
- C++编译时使用 constexpr 字符数组指针分配静态数组?
- 我可以使用 constexpr 函数声明一个静态数组吗?
- 如何在静态函数中使用成员函数数组
- 具有大的2d数组:静态int与int