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

标签 c++ arrays static-array

根据Static array vs. dynamic array in 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++ 中,不检查数组的边界。您没有收到任何错误或警告,主要是因为这个。但同样,访问超出数组限制的元素是未定义的行为。未定义的行为意味着它是一个可能不会立即显示的错误(表面上是好的,但实际上不是)。甚至程序显然也可以毫无问题地结束。

关于C++/是否允许更改静态数组的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13439898/

相关文章:

c++ - 堆实现

c++ - std::map.find 上的 Sigbus

C++11:decltype((x)) 和 decltype((x+1)) 的类型不同?

arrays - 接受任意大小的静态数组的函数 (D)

C++11/14/17,GCC 7 与 GCC 8 : Name lookup for friend class templates

c++ - 算法 - 圆阵旋转

arrays - MongoDB slice 查询到golang

arrays - 粘贴 VBA 数组在特定行后返回 #NA

java - 如何使用硬编码值声明自定义数据类型的静态数组?

c++ - 方法指针的静态数组