2016-01-08 1 views
0
using namespace std; 
char str1[10],str2[10]; 
cin.getline(str1,14); 
cin.getline(str2,10); 
cout<<strlen(str1)<<'\t'<<strlen(str2); 

Выход указанного выше кода был следующим образом-непредсказуемой длина строки, когда второй аргумент (cin.getline) больше, чем длина массива

123456789
bye 
13   3 

Как может быть длиной str1 Большого чем 10?

+0

http://stackoverflow.com/questions/2346806/what-is-segmentation-fault –

+2

Вот почему вы должны использовать 'std :: string' для ввода. –

ответ

0

Потому что это, скорее всего, будет использовать пространство, зарезервированное для str2. Но это неопределенное поведение, оно может сделать что угодно (вероятно, segfault (нарушение прав доступа или что-то еще названо в вашей ОС)

+0

_ «Скорее всего, это место зарезервировано для str2» _ Это? –

4

Это не возможно. Вы перегрузили свой буфер и перезаписали память вне массива. не врезаться или телепортироваться кошкой в ​​монитор, прежде чем он нашел '\0' не ранее, чем 13 байт в памяти с самого начала вашего массива 10 элементов.

3

поведением вашего переполнить char массива является неопределенным. для будьте ясны, вам необходимо убедиться, что для ваших данных достаточно места и a \0 string terminator иначе поведение cout будет неопределенным.

Компилятор разрешает делать что-нибудь, если он встретит это.

Ваш выход является общим проявлением, но вы должны не полагаться на такое поведение.

+0

Тогда почему не возникла какая-либо ошибка времени выполнения, связанная с ошибкой сегментации? Мой компилятор g ++ 4.8.2 работает на терминале gnome Ubuntu 14 –

+1

Потому что ваш компилятор был добр к вам. Он мог съесть вашу кошку. Это характер неопределенного поведения. C++ не делает то, что он считает ненужными проверками времени выполнения. – Bathsheba

+1

@dlpcoder: ошибки сегментации не гарантируются каждый раз, когда вы перегружаете буфер (как правило, только тогда, когда вы перегружаете его так сильно, что вы запрашиваете из памяти ОС, которая находится на недоступной странице виртуальной памяти или разыменовывает нулевой указатель). Многие (большинство?) Уязвимостей безопасности полагаются на этот факт. –

Смежные вопросы