C ++ Создание массива с переменной длиной генерирует массив произвольного размера - PullRequest
0 голосов
/ 06 апреля 2019

Я воссоздаю строковый класс, используя массивы символов. Моя проблема в том, что когда я выделяю память для большего массива, он генерирует массив совершенно неправильного размера.

Например:

int allocated = 4;
char * reservedString = new char[allocated];
cout << strlen(reservedString);

Вместо создания массива символов размером 4, зарезервированная строка указывает на массив символов с 14 точками, содержащими случайные символы.

enter image description here

Это то, что показывает мне отладка. Зарезервированная строка теперь имеет неправильный размер со множеством случайных символов. Когда я пытаюсь использовать strcpy или strcpy_s, он записывает память за пределы, потому что новые размеры массива неверны.

Как я могу создать массив символов с неизвестной длиной, который предоставляется переменной, который имеет правильный размер. Я не могу использовать класс std :: string или std :: vector.

Ответы [ 2 ]

1 голос
/ 06 апреля 2019

strlen ожидает строку с нулевым символом в конце, что означает строку, оканчивающуюся нулевым символом (\0).Вы передаете ему указатель, указывающий на вновь выделенную память, которая содержит неинициализированные значения (в основном случайные, но технически «промежуточные» и чтение их вызывает неопределенное поведение).Поэтому, когда strlen ищет нулевой символ для определения длины строки, все идет не так, как надо.

Вы не можете определить размер массива, учитывая только указатель на него, если вы не знаетеэто будет завершено нулевым символом или чем-то подобным.Поэтому либо правильно инициализируйте массив строкой с нулевым символом в конце, либо сами следите за длиной.

1 голос
/ 06 апреля 2019

Когда вы создаете объект с новым оператором, ваши данные остаются не инициализированными. Код, который вы предоставляете, представляет собой массив байтов.

Документация о strlen гласит:

вычисляет длину строки до, но не включая завершающий нулевой символ.

Здесь нет нулевого терминатора.

Вы должны сделать:

int allocated = 4;
char * reservedString = new char[allocated]();

Это инициализирует ваш массив и установит все элементы на \0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...