Динамическое выделение памяти для указателя на символ

У меня странная проблема, связанная с динамическим выделением памяти для указателя на символ.
У меня есть что-то вроде

char *input = new char; //1
gets(input) //2
char *dest = new char; //3

во время шага 3 я получаю ошибку повреждения кучи во время выполнения. Это происходит только в том случае, если длина вводимой строки превышает 23 символа.

Если я не делаю какие-либо новые операции, то это не проблема.

Эта проблема решена, если я укажу

 char *input = new char[100]; 

Но я хочу, чтобы ввод был динамическим в зависимости от ввода пользователя.

Я не уверен, какова роль 24 байта в этом случае. Я не хочу ограничиваться 100 или несколькими n символами ... Я немного слаб в распределении памяти ... Может кто-нибудь объяснить этот сценарий?

3

Решение

Нет, так нельзя.
Вы можете использовать только статический буфер или использовать «cpp-way», который:

std::string str;
std::getline(std::cin, str);
6

Другие решения

Ваша программа демонстрирует неопределенное поведение на входе любой длины больше нуля, потому что gets добавляет нулевой терминатор. Тот факт, что программа не вылетает до 23 символов, является неудачным совпадением.

Если вы хотите, чтобы буфер размещался динамически, не используйте gets или же charвход на основе; вместо этого прочитайте ваши данные в std::string,

5

Если вы не знаете, какую длину будет вводить пользователь, и не хотите ограничивать ввод данных пользователем, тогда вам нужно выделить достаточную длину буфера. Вы можете использовать строку STL, но она также выделяет достаточно памяти для вас динамически, она просто скрывает детали выделения для вашей программы.

2

Никогда не используй gets() (со страницы руководства):

Проверка переполнения буфера не выполняется

В зависимости от того, что введено там, вы получите переполнение буфера.

1
new char

Выделяет память на ОДИН символ Он может потерпеть неудачу после второго символа (фактически даже после первого, так как вы получите символ '\ 0').

Пожалуйста, используйте C ++, если вы помечаете вопрос как C ++, а не C! Это означает использование std :: string

0
По вопросам рекламы [email protected]