Во втором примере вы перезаписываете большую часть стека, которая, вероятно, вылетит, хотя неопределенное поведение может привести к другим неожиданным результатам.
char s[] = "";
- это то же самое, что и char s[1] = {'\0'};
, который содержит только один элемент, нулевой символ. Книга просто говорит, что в этом случае она определяет размер для вас и копирует его в стек.
Затем, когда вы используете cin.getline(s, 50);
и сообщаете ему, что на самом деле его длина составляет 50 символов, он может записывать после конца массива и перезаписывать другие вещи, которые компилятор поместил в стек, вызывая повреждение.
Часто для таких вещей, как getline
, если у вас есть выделенный массив из стека, sizeof
может использоваться для безопасного определения размера, который будет учитывать будущие изменения.
cin.getline(s, sizeof(s));
Но в C ++ почти всегда лучше использовать std::string
для строк и либо std::vector
для массивов динамического размера, либо std::array
для массивов фиксированного размера. Помимо прямой поддержки гораздо большего числа функций, они также управляют памятью и позволяют избежать многих распространенных ошибок.
std::string line;
std::getline(std::cin, line);