数组字符持有超过预期

时间:2015-01-10 11:03:16

标签: c++ arrays char

我对以下代码感到困惑......请澄清。

当我使用此代码时:

#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 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

第一个代码段由纯粹运气完成。您将10个字符输入到只能容纳 9 的数组中:最后一个位置是C样式字符串,用于终止0

由于两个(相关)原因,它似乎有效:

  1. 您输入的超过9个字符。尝试输入更多,更多,程序肯定会崩溃。
  2. 在堆栈上的此数组之后,内存中必定存在零。如果没有,您的输出循环将继续打印数据,直到内存不足或在其他任何地方遇到0
  3. 所以这在技术上是“缓冲区溢出”。

    第二个片段中的错误是因为您的编译器知道您不应该将 n 字符存储到长度 n 的数组中 - 它指出没有终止0的空间。