持有多于预期的数组字符
Array character holding more than expected
我对下面的代码感到困惑...请澄清。
当我使用这段代码时:
#include<iostream>
using namespace std;
int main()
{
char array[10];
cin>>array;
int i=0;
while(array[i]!='[=10=]')
{
cout<<array[i];
i++;
}
}
并输入:qwertyuiop
- 10 个字符。它的输出又是qwertyuiop
。
但是当我按照下面给出的代码初始化数组时,它给出了字符串对于数组来说太长的错误!解释一下?
#include <iostream>
using namespace std;
int main() {
char array[10]="qwertyuiop";
int i=0;
while(array[i]!='[=11=]')
{
cout<<array[i];
i++;
}
}
这里是一个缓冲区溢出的例子。您的输入字符串在 array
结束后重写了一些字节。但这是运行时的问题,编译时检测不到。
代码的真正问题是程序的行为是不确定的。有时程序会崩溃,有时不会。
您确实需要一个合理大小的缓冲区(f.e。100 个或更多字符),并使用有限输入的方法。
第一个代码片段完全靠运气。您正在向一个只能容纳 9 的数组中输入 10 个字符:在 C 样式字符串中,最后一个位置是终止 0
.
所必需的
由于两个(相关)原因,它似乎有效:
- 您输入的字符不多 9 个。尝试输入很多很多,程序肯定会崩溃。
- 在堆栈中这个数组之后的内存中一定有一个偶然的零。如果没有,您的输出循环将继续打印数据,直到内存不足或在其他任何地方遇到
0
。
所以这在技术上是 "buffer overflow"。
第二个片段中的错误是因为您的编译器知道您不应该将 n 个字符准确存储到长度为 n 的数组中 - - 它指出终止 0
.
没有空间
我对下面的代码感到困惑...请澄清。
当我使用这段代码时:
#include<iostream>
using namespace std;
int main()
{
char array[10];
cin>>array;
int i=0;
while(array[i]!='[=10=]')
{
cout<<array[i];
i++;
}
}
并输入:qwertyuiop
- 10 个字符。它的输出又是qwertyuiop
。
但是当我按照下面给出的代码初始化数组时,它给出了字符串对于数组来说太长的错误!解释一下?
#include <iostream>
using namespace std;
int main() {
char array[10]="qwertyuiop";
int i=0;
while(array[i]!='[=11=]')
{
cout<<array[i];
i++;
}
}
这里是一个缓冲区溢出的例子。您的输入字符串在 array
结束后重写了一些字节。但这是运行时的问题,编译时检测不到。
代码的真正问题是程序的行为是不确定的。有时程序会崩溃,有时不会。
您确实需要一个合理大小的缓冲区(f.e。100 个或更多字符),并使用有限输入的方法。
第一个代码片段完全靠运气。您正在向一个只能容纳 9 的数组中输入 10 个字符:在 C 样式字符串中,最后一个位置是终止 0
.
由于两个(相关)原因,它似乎有效:
- 您输入的字符不多 9 个。尝试输入很多很多,程序肯定会崩溃。
- 在堆栈中这个数组之后的内存中一定有一个偶然的零。如果没有,您的输出循环将继续打印数据,直到内存不足或在其他任何地方遇到
0
。
所以这在技术上是 "buffer overflow"。
第二个片段中的错误是因为您的编译器知道您不应该将 n 个字符准确存储到长度为 n 的数组中 - - 它指出终止 0
.