2012-06-09 113 views
1

我也遇到过,当我写代码很奇怪的问题,这是我的C++代码:很奇怪的C++错误

#include <iostream> 
using namespace std; 

int main() 
{ 
    int qnum; 
    cin >> qnum; 
    int series[3]; 
    cin >> series[3]; 
    cout << qnum; 
} 

例如,如果我的qnum输入2和5系列[3] qnum的价值将在代码。此问题的最后一行覆盖将只有当一系列的输入3.新的唯一的解决办法是增加发生“静态”属性qnum,就像这样:

#include <iostream> 
using namespace std; 

int main() 
{ 
    static int qnum; 
    cin >> qnum; 
    int series[3]; 
    cin >> series[3]; 
    cout << qnum; 
} 

有什么建议吗?

+2

您可以从0开始计数。因此,串联的最后一个有效索引是[2] –

+0

您应该在启用所有警告的情况下编译您的代码。每个体面的编译器都应该警告这样的事情。 – pmr

+0

@pmr:我想,取决于你对“体面”编译器的定义。 GCC没有'-Wall -Wextra'(尽管也许有一些其他更隐蔽的标志可以检测到这一点)。 –

回答

11

没有series[3]。只有series[0],series[1]series[2](阵列从0到N-1)。

您正在注销数组的末尾,导致未定义的行为。

+0

谢谢你回答,我是一个新手,对于问这样愚蠢的问题感到抱歉。 –

+0

哦,我知道这是一个缓冲区覆盖的地方,但我没有注意到他正在写入3个数组的第四个元素。 – Zoey