这是如何发生静态的?

时间:2011-08-09 07:35:17

标签: c++

需要帮助才能了解以下行为。

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这是异常的。请帮忙.....

8 个答案:

答案 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)

您正在访问数组越界,这将导致缓冲区溢出。该程序可能会或可能不会运行,因此术语“未定义的行为”