Строковой литерал на позиции инициализатора массива char'ов
В книге Бьёрна Страуструпа "Язык программирования С++. Специальное издание. 2011г. (стр.176)" увидел достаточно лаконичный способ инициализации массива char'ов константным строковым литералом:
Например, копирование строк с терминальным нулем можно выполнить следующим образом:
void cpy (char* p, const char* q) { while (*p++=*q++); }
Решил проверить корректность работы в Visual Studio 2020
Накидал простенький код:
const int size = 14;
const char* str1 = "Hello, World!";
char* str2 = new char[size];
while(*str2++ = *str1++);
На выходе получил мусор. Почему?
Если массив char'ов создаём в стеке, а не в куче
char str2[size];
- в строке с условием цикла выдаёт ошибку: "выражение должно иметь константное значение c++ массив"
Проверку на корректность вывода массива сhar'ов осуществлял следующим образом:
while (*str2)
std::cout << *str2++;
Ответы (1 шт):
Ошибка заключалась в банальной невнимательности!
После копирования содержимого строкового литерала, str2 указывал на область памяти за границами массива, поэтому на выходе получался мусор.
Следовательно, как вариант, при определении массива str2, можно было создать еще один указатель на начало массива str2 и уже его использовать для просмотра содержимого массива:
char* str2 = new char[size];
char* str3 = str2;
while (*str3)
std::cout << *str3++;