C++ C++;/是否允许更改静态数组的大小?
根据正确答案,在静态数组中有固定大小 但是,这可以很好地编译和运行:C++ C++;/是否允许更改静态数组的大小?,c++,arrays,static-array,C++,Arrays,Static Array,根据正确答案,在静态数组中有固定大小 但是,这可以很好地编译和运行: 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<<
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 main(int argc,char**argv){
int-myArray[2];
myArray[0]=0;
myArray[1]=1;
cout不,绝对不可能。你所做的只是在它的边界之外非法访问它。这恰好没有为你抛出错误这一事实是完全无关的。它完全是UB。首先,这不是一个静态数组,它是在自动存储中分配的数组
其次是
myArray[4];
不是新的声明,它是从先前声明的2元素数组的元素#4中丢弃的读取-未定义的行为
接下来的作业
myArray[2] = 2;
myArray[3] = 3;
写入未分配给程序的内存-这也是一种未定义的行为。实际上并不是在扩大数组。让我们详细了解您的代码:
int myArray[2];
myArray[0] = 0;
myArray[1] = 1;
您创建了一个包含两个位置的数组,索引范围为0到1。到目前为止,一切正常
myArray[4];
您正在访问数组中的第五个元素(数组中肯定不存在的元素)。这是未定义的行为:任何事情都可能发生。您没有对该元素执行任何操作,但这并不重要
myArray[2] = 2;
myArray[3] = 3;
现在您正在访问元素3和元素4,并更改它们的值。同样,这是未定义的行为。您正在更改所创建数组附近的内存位置,但“没有其他内容”。数组保持不变
实际上,您可以通过执行以下操作来检查阵列的大小:
std::cout << sizeof( myArray ) / sizeof( int ) << std::endl;
std::cout No,它不是偶然失败的。这取决于您使用的是什么。Visual Studio识别出这是一个错误,我得到运行时检查失败#2-变量“myArray”周围的堆栈已损坏。
但更重要的是,dasblinkenlight说出了我要说的话。这是myArray上的一个虚拟读取[4]这不是一个声明/resize@acidzombie24cool-VS隐式使用堆栈保护。仅供参考,学习如何使用stack/deque/map/set是一个好主意。AI打算发布这篇文章,但想确认他的代码对我来说确实失败了(确实失败!)为什么这不是一个静态数组?我如何才能使它成为一个静态数组?@KorayTugay:static int myArray[2]有两种方法可以创建一个静态数组——在任何函数外部声明它,在没有关键字static
的情况下使用ot,或者在函数内部声明关键字static
。哦,是的,我应该说“静态声明数组”谢谢。我最好的猜测是,在大多数机器上,包括所有x86
s@KorayTugay未定义的行为。这意味着任何事情都可能发生,编译器不需要报告有关的错误it@KorayTugay未定义的行为。不能排除机器着火的可能性。