根据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/