Я смущен о коде ниже... пожалуйста, уточните.
Когда я использую этот код:
#include<iostream>
using namespace std;
int main()
{
char array[10];
cin>>array;
int i=0;
while(array[i]!='\0')
{
cout<<array[i];
i++;
}
}
и qwertyuiop
ввод: qwertyuiop
- 10 символов. Он qwertyuiop
снова qwertyuiop
.
Но когда я инициализирую массив, как в приведенном ниже коде, он дает ошибку, что строка слишком длинна для массива! Объяснение?
#include <iostream>
using namespace std;
int main() {
char array[10]="qwertyuiop";
int i=0;
while(array[i]!='\0')
{
cout<<array[i];
i++;
}
}
Первый фрагмент кода работает по чистой удаче. Вы вводите 10 символов в массив, который может содержать только 9: последняя позиция, в строках стиля C, необходима для завершения 0
.
Похоже, что он работает по двум (связанным) причинам:
0
другом месте.Таким образом, это технически "переполнение буфера".
Ошибка во втором фрагменте заключается в том, что ваш компилятор знает, что вы не должны хранить ровно n символов в массиве длины n - он указывает, что нет места для завершения 0
.
Ниже приведен пример переполнения буфера. Ваша строка ввода перезаписывает несколько байтов после окончания array
. Но это проблема времени выполнения, и она не может быть обнаружена во время компиляции.
Реальная проблема кода заключается в том, что поведение программы не является детерминированным. Иногда программа может сбой, а иногда нет.
Вам действительно нужен буфер разумного размера (fe 100 или более символов) и использовать методы с ограниченным доступом.
std::cin
ничего не усекает автоматически. Он пишет за концом массива и забивает соседнюю память.
char
в массив из 10char
.