![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
rp80 |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Есть такой код.
2 вопроса: 1. Правильны ли следующие рассуждения относительно первых двух объявлений str_copy? В первом случае указатель объявлен, но еще не инициализирован, т.е. фактически никуда не указывает ещё, поэтому и обращения к нему некорректны. Во втором случае str_copy объявлена как строковый литерал, т.е. как const char[2] и во-первых изменять значения такого массива нельзя, а во-вторых указатель выходит за рамки массива после 2. 2. Почему работает последний вариант? Ведь по идее надо бы выделить память следующим образом char* str_copy=new char[strlen(str)]; Спасибо. |
|
|
![]() |
Алексей1153 |
![]()
Сообщение
#2
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
rp80,
а зачем вот это чудо тут ?
а почему работает копирование в константу - это чистая случайность Цитата char* str_copy=new char[1];//Работает тоже до поры до времени. Нет терминатора! Сообщение отредактировал Алексей1153 - 4.11.2011, 9:45 |
|
|
rp80 |
![]()
Сообщение
#3
|
Студент ![]() Группа: Участник Сообщений: 36 Регистрация: 10.9.2011 Пользователь №: 2860 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
rp80, а зачем вот это чудо тут ?
Это не пиип, а пример expression-oriented coding из Страуструпа. Функция работает так как и задумано. а почему работает копирование в константу - это чистая случайность Цитата char* str_copy=new char[1];//Работает тоже до поры до времени. Нет терминатора! char* str_copy=new char[1] - не константа далеко. И терминатор в этой строке не нужен, потому что в нее копируем а не из нее. Я уже в общем понял почему так происходит.. Хоть память выделена и под 1 чар, но за этим сегментом есть какие-то следующие, поэтому q++ существует и туда можно записать. Но память все равно нужно выделять под весь массив, ибо иначе мы можем залезть в память , выделенную под другие объекты. |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 20.6.2025, 23:47 |