2015-01-10 29 views
0

我对以下代码感到困惑......请澄清。阵列角色持有超过预期

当我使用此代码:

#include<iostream> 
    using namespace std; 
int main() 
{ 
    char array[10]; 
    cin>>array; 
    int i=0; 
    while(array[i]!='\0') 
     { 
     cout<<array[i]; 
     i++; 
     } 
} 

,给输入:qwertyuiop - 10个字符。它的输出是qwertyuiop

但是当我像下面给出的代码那样初始化数组时,它给出了字符串对于数组来说太长的错误!说明?

#include <iostream> 
using namespace std; 

int main() { 
char array[10]="qwertyuiop"; 
int i=0; 
while(array[i]!='\0') 
    { 
    cout<<array[i]; 
    i++; 
    } 
} 
+2

你的第一个例子是缓冲区溢出,第二个例子是不会编译的,因为你试图将11 char'填充到10 char元素中。 – Blastfurnace

回答

0

第一个代码片段的作品纯粹运气。您将10个字符输入到只能容纳的阵列中:最后一个位置是C风格字符串,终止0需要。

这似乎是工作,因为两个(相关的)原因:

  1. 您进入不超过900个字符。尝试输入许多,更多,程序肯定会崩溃。
  2. 在堆栈中的这个数组之后,内存中必然有一个零。如果没有,则输出循环将继续打印数据,直到内存用完或在其他地方遇到0

所以这在技术上是一个“缓冲区溢出”。

在第二片段中的错误是因为你的编译器知道你不应该准确ň字符存入长度的数组n - 它指出,没有任何余地终止0

+0

谢谢你,先生:) – sgoel

3

这是一个缓冲区溢出的例子。您的输入字符串会在array结束后重写一些字节。但是这是一个运行时问题,并且在编译时无法检测到。

代码的真正问题是程序的行为是非确定性的。有时程序可能会崩溃,有时候不会。

你确实需要一个合理大小的缓冲区(如100或更多的字符),并使用有限输入的方法。

+0

所以你在说这个例子中的第10个字符是'p'。我的数组将保持正确。现在,由于cin自动截断字符串,但是上面没有剩余空间,程序将占用相邻的内存。总之这个字符串不会被截断? – sgoel

+0

@ user3800101:'std :: cin'不会自动截断任何东西。它会写入数组的末尾并触发邻近的内存。 – Blastfurnace

+0

如果它不自动截断程序已完成的方式。既然'时'不应该被阻止? – sgoel