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)
这是否意味着可以调整静态数组的大小?
不,不是地狱的机会.你所做的就是非法访问它的界限.事实上,这不会给你带来错误是完全无关紧要的.这是彻底的UB.
首先,这不是静态数组,而是在自动存储中分配的数组.
接下来,
myArray[4];
Run Code Online (Sandbox Code Playgroud)
它不是一个新的声明,它是从先前声明的2元素数组的元素#4中丢弃的读取 - 未定义的行为.
随后的作业
myArray[2] = 2;
myArray[3] = 3;
Run Code Online (Sandbox Code Playgroud)
写入未分配给程序的内存 - 也是未定义的行为.
你实际上并没有放大阵列.让我们详细看看你的代码:
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++中,不检查数组的边界.您没有收到任何错误或警告,主要是因为这一点.但同样,访问超出数组限制的元素是未定义的行为.未定义的行为意味着它可能不会立即显示.甚至程序显然也可以毫无问题地结束.
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
236 次 |
| 最近记录: |