数组字符包含量超出预期

Array character holding more than expected

本文关键字:字符 包含量 数组      更新时间:2023-10-16

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

当我使用此代码时:

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

并给出输入:qwertyuiop - 10 个字符。它的输出再次qwertyuiop

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

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

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

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

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

第一个代码片段完全靠运气工作。您在只能容纳 9 个字符的数组中输入 10 个字符:在 C 样式字符串中,最后一个位置是终止0所必需的。

它似乎由于两个(相关)原因而起作用:

  1. 您输入的字符不超过 9 个字符。尝试输入很多很多,程序肯定会崩溃。
  2. 碰巧,堆栈上这个数组之后的内存中一定有一个零。如果没有,输出循环将继续打印数据,直到内存不足或在其他任何地方遇到0

所以这在技术上是"缓冲区溢出"。

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