Массивы переменной длины (VLA) являются , а не частью стандарта C ++.Подробнее в Почему массивы переменной длины не являются частью стандарта C ++?
Но, скажем, вы используете расширение компилятора , которое позволяетпроблема в том, что вы используете здесь функцию C:
std::cout << strlen(a) << '\n';
, которая ожидает строку C, что означает NULL-оканчивающуюся строку .
Этоозначает, что вы должны сделать ваш массив достаточно большим, чтобы содержать символ завершения NULL, например:
char a[s.length() + 1];
, поскольку string::length()
вернет 4 для строки "1010".Это означает, что строка C должна быть такой: «1010 \ 0», то есть фактическая строка, к которой добавляется завершающий символ NULL.В результате для хранения этой строки вам понадобится массив размера 5.
Простое исправление:
char a[s.length() + 1] = {0};
, которое инициализирует NULL каждую ячейку массива.Затем вы будете перезаписывать каждую его ячейку символами, кроме последней из ячеек, специально зарезервированных для терминатора NULL.
Другой подход заключается в назначении только терминатора NULL последней ячейке вашей строки, например a[s.length()] = '\0';
.Обратите внимание, что s.length()
теперь является индексом последнего элемента вашего массива.
Стандартные строковые функции C (например, strlen()
) зависят от символа завершения NULL, который нужно пометитьконец строки.В отсутствие этого важного персонажа они не знают, когда остановиться, и, таким образом, получают доступ к памяти за пределами того места, которое они должны посетить.
Это вызывает Неопределенное поведение (UB), которое на вашем компьютере обращается к памяти со значениями мусора.