0 / 0 / 0
Регистрация: 27.02.2021
Сообщений: 42
|
|
1 | |
Работа с массивом char через динамическую память15.05.2021, 12:53. Показов 2632. Ответов 4
Здравствуйте. Изучаю для себя как работают Си-строки, используя память динамически. Вопрос в следующем: я выделяю память динамически под один элемент. При включении отладчика, видно, что выделилась память под один элемент и после этого еще какие-то "ээээ" (смотреть первый скрин). Первый вопрос заключается как раз таки в том, что за код (или что за приведение типов) подразумевают эти "ээээ". Ладно, бог с ним, дальше через функцию cin я определяю выделенную память (После этого "ээээ" пропадают). Я думал в начале что это всё-таки терминирующий ноль, поскольку после использования cin возникает понятная утечка памяти. Кстати к этому у меня тоже вопрос: как можно увидеть, я использовал функцию strlen, которая вроде как работает с терминирующим нулём, и поскольку терминирующий ноль "съели", то функция должна крашнутся, но этого не происходит, а вот оператор delete[] крашится и видимо из-за как раз таки терминирующего ноля (скрин 2,3). Именно поэтому возникает вопрос: а это точно терминирующий ноль?
Но да ладно. Возьмем другую ситуацию. На скрине 4 я определил конкретный элемент иии... там после него просто огромнейшее кол-во символов, и strlen возвращает 14 символов. Вопрос: откуда? Почему они там появились? Использую IDE Visual studio 19'го стандарта, с отключенным /permissive-.
0
|
15.05.2021, 12:53 | |
Ответы с готовыми решениями:
4
Работа с массивом char Работа с массивом char Работа с массивом char Работа с массивом char |
Модератор
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
|
||||||
15.05.2021, 13:45 | 2 | |||||
метод
а при самостоятельном заполнении это обязанность программиста! strlen считает количество символов до терминального нуля. Если его не вставить, то она будет считать дальше, пока не наткнется на ноль или выйдет за границы дозволенной памяти.
1
|
0 / 0 / 0
Регистрация: 27.02.2021
Сообщений: 42
|
|
15.05.2021, 14:57 [ТС] | 3 |
Спасибо
Добавлено через 7 минут А почему тогда выход за границы не срабатывает для оператора delete[], во втором случае(скриншот 4)? Там же выход получается за границы выделенной памяти, как и в первом случае? Добавлено через 2 минуты то есть я имею ввиду, там же должен был в таком случае вылететь экспешн как и в первый раз (скрин 2) для delete[]?
0
|
Модератор
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
|
|
15.05.2021, 18:07 | 4 |
Сообщение было отмечено Lognus как решение
Решение
Исключение может и не сработать (не обязательно выход за границы портит что-то существенное).
1
|
0 / 0 / 0
Регистрация: 27.02.2021
Сообщений: 42
|
|
15.05.2021, 18:11 [ТС] | 5 |
Понял вас. Спасибо огромное!
0
|
15.05.2021, 18:11 | |
15.05.2021, 18:11 | |
Помогаю со студенческими работами здесь
5
Работа с массивом символов Char работа с массивом символов типа Char Работа с текстовым массивом типа char Работа с рваным массивом, тип элементов char Работа с массивом через пользовательские функции через указатели Работа с массивом с через strcpy_s() Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |