需要帮助才能了解以下行为。
static int a;
int b[a];
for(int i=0; i<10; i++)
b[i] = i+1;
for(int i=0; i<10; i++)
cout << " " << b[i];
输出是 $&GT; 1 2 3 4 5 6 7 8 8 10
但是,如果我将变量'a'声明为auto [like int a],那么它会在运行时崩溃,这很明显。但为什么它与静态一起工作。 此外,如果我运行循环更多的时间(高于10)它崩溃。我做了12并且它崩溃了。此外,在输出8中,而不是在8和8之间的9。 10这是异常的。请帮忙.....
答案 0 :(得分:5)
没有显式初始值设定项的静态变量初始化为零。
static int a;
int b[a];
b
被初始化为0 int
的数组。
C ++不进行任何边界检查,它允许您在其边界外访问数组,但它会调用未定义的行为。
int b[a];
声明一个可变长度数组,这只是编译器提供的扩展,这不是标准的一部分,因此不可移植。
正如@Als建议的那样,您可以使用-pedantic
编译器选项进行编译,该选项会抛出类似
ISO C ++禁止可变大小数组
你似乎想要的只是
static int b[10];
答案 1 :(得分:2)
static int a;
表示a
初始化为零,因此以下行:
int b[a];
毫无意义。
你得到输出完全有点奇怪,因为 我收到了编译错误;
error: array bound is not an integer constant
在C ++中(至少)变量a
必须是const
。
答案 2 :(得分:1)
数组b[]
的大小未知,我没有看到您为a
分配了任何值,
您所看到的是未定义的行为。
假设a
不是全局的,那么当它成为static
时,它将不在堆栈中,而是可以放在数据部分中
答案 3 :(得分:0)
崩溃是因为你没有初始化变量a(默认为static int初始化为0)。写例:
static int a = 50;
它会正常工作
它有时会工作,因为你幸运地在这片记忆中有些垃圾。当你超出范围时,c ++中的数组不会抛出异常。但是当你的程序写入保护内存时,它会崩溃
答案 4 :(得分:0)
在没有初始化器的情况下,保证静态变量初始化为零。
答案 5 :(得分:0)
我猜你很幸运,它没有崩溃。 a
初始化为0,这意味着您正在通过数组写入内存,这可能意味着什么。
我认为你期待崩溃。事实是,即使你访问超出数组限制的内存,这并不意味着你会崩溃。它还可以覆盖代码的其他变量或内存内容。这可以注意到(例如崩溃),或者它可以是沉默的,产生奇怪的结果。
它没有被称为“未定义”的行为。
答案 6 :(得分:0)
这里有一些问题。
首先:这是无效的C ++。看起来你正在使用C99的可变长度数组,它从未进入任何C ++标准。我很惊讶你的编译器至少不会警告你。在C ++中,数组长度必须是编译时常量。
您永远不会初始化a
。当a
变为静态时,它会默认初始化为0
,因此您将创建一个零长度数组。如果它不是静态的,则不会进行这样的隐式初始化 - 它具有未定义的值。因此,使用未定义的长度创建数组,并且它很可能太大而无法放入堆栈空间并导致崩溃。
此外,在static
变体中,您正在读取/写入0长度数组中的10个元素,这也会导致未定义的行为。这意味着标准没有定义在这种奇怪的情况下会发生什么,因此允许发生任何。它纯粹只是偶然为你服务!
答案 7 :(得分:0)
您正在访问数组越界,这将导致缓冲区溢出。该程序可能会或可能不会运行,因此术语“未定义的行为”