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

Kor*_*gay 2 c++ arrays static-array

根据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;
}
Run Code Online (Sandbox Code Playgroud)

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

Pup*_*ppy 7

不,不是地狱的机会.你所做的就是非法访问它的界限.事实上,这不会给你带来错误是完全无关紧要的.这是彻底的UB.

  • @KorayTugay未定义的行为.机器着火不能排除. (2认同)

das*_*ght 5

首先,这不是静态数组,而是在自动存储中分配的数组.

接下来,

myArray[4];
Run Code Online (Sandbox Code Playgroud)

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

随后的作业

myArray[2] = 2;
myArray[3] = 3;
Run Code Online (Sandbox Code Playgroud)

写入未分配给程序的内存 - 也是未定义的行为.


Bal*_*arq 5

你实际上并没有放大阵列.让我们详细看看你的代码:

int myArray[2];

myArray[0] = 0;
myArray[1] = 1;
Run Code Online (Sandbox Code Playgroud)

你创建了一个包含两个位置的数组,索引从0到1.到目前为止,非常好.

myArray[4];
Run Code Online (Sandbox Code Playgroud)

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

myArray[2] = 2;
myArray[3] = 3;
Run Code Online (Sandbox Code Playgroud)

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

实际上,您可以通过执行以下操作来检查数组的大小:

std::cout << sizeof( myArray ) / sizeof( int ) << std::endl;
Run Code Online (Sandbox Code Playgroud)

您将检查阵列的大小是否未更改.顺便说一句,这个技巧在声明数组的同一个函数中工作,一旦你将它传递到它就会衰减成一个指针.

在C++中,不检查数组的边界.您没有收到任何错误或警告,主要是因为这一点.但同样,访问超出数组限制的元素是未定义的行为.未定义的行为意味着它可能不会立即显示.甚至程序显然也可以毫无问题地结束.

希望这可以帮助.