Оба фрагмента кода
char qs2[7];
cin >> qs2; //input 123456789
cout << qs2; //out same as input, expecting 123456
char *qs3 = new char[7];
cin >> qs3; //input 123456789
cout << qs3; //out same as input, expecting 123456
имеют неопределенное поведение. Память за пределами выделенных массивов перезаписывается. Последствия могут быть любого вида.
Рассмотрим следующую демонстрационную программу.
#include <iostream>
int main()
{
char gs1[7] = "123456";
char gs2[7];
char gs3[7] = "ABCDEF";
std::cin >> gs2;
std::cout << '\n';
std::cout << gs1 << '\n';
std::cout << gs2 << '\n';
std::cout << gs3 << '\n';
return 0;
}
Если ввести
1234567
, то вывод программы может выглядеть как
123456
1234567
Как видите, строка "ABCDEF"
не была выведена. Это результат того, что завершающий ноль '\0'
, который был добавлен к массиву gs2
после того, как этот оператор
std::cin >> gs2;
перезаписывает первый символ массива gs3
. Теперь его содержимое выглядит как
{ '\0', 'B', 'C', 'D', 'F', '\0' }
Так как первый элемент массива является конечным нулем, тогда в этом выражении выводилась пустая строка
std::cout << gs3 << '\n';