Массив символов держит больше, чем ожидалось

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 ввод: 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++;
    }
}
  • 2
    Ваш первый пример - переполнение буфера, а второй не компилируется, потому что вы пытаетесь вставить 11 char в массив из 10 char .
Теги:
arrays
char

2 ответа

0
Лучший ответ

Первый фрагмент кода работает по чистой удаче. Вы вводите 10 символов в массив, который может содержать только 9: последняя позиция, в строках стиля C, необходима для завершения 0.

Похоже, что он работает по двум (связанным) причинам:

  1. Вы вводите не более 9 символов. Попробуйте ввести многие, многие другие, и программа, безусловно, потерпит крах.
  2. Должен быть, случайно, нуль в памяти сразу после этого массива в стеке. Если этого не произошло, ваш выходной цикл будет продолжать печатать данные до тех пор, пока он не исчерпает память или не встретит 0 другом месте.

Таким образом, это технически "переполнение буфера".

Ошибка во втором фрагменте заключается в том, что ваш компилятор знает, что вы не должны хранить ровно n символов в массиве длины n - он указывает, что нет места для завершения 0.

  • 0
    Спасибо, сэр :)
3

Ниже приведен пример переполнения буфера. Ваша строка ввода перезаписывает несколько байтов после окончания array. Но это проблема времени выполнения, и она не может быть обнаружена во время компиляции.

Реальная проблема кода заключается в том, что поведение программы не является детерминированным. Иногда программа может сбой, а иногда нет.

Вам действительно нужен буфер разумного размера (fe 100 или более символов) и использовать методы с ограниченным доступом.

  • 0
    Так что вы говорите, что до 10-го символа, который является «р» в этом случае. Мой массив будет держать правильно. Теперь, поскольку cin автоматически обрезает строку, но для этого не осталось места для этого, программа будет занимать смежную память. Короче эта строка не будет усечена?
  • 0
    @ user3800101: std::cin ничего не усекает автоматически. Он пишет за концом массива и забивает соседнюю память.
Показать ещё 3 комментария
Сообщество Overcoder
Наверх
Меню