crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

rp80
  опции профиля:
сообщение 4.11.2011, 0:12
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 10.9.2011
Пользователь №: 2860

Спасибо сказали: 0 раз(а)




Репутация:   0  


Есть такой код.

void cpy(char* p, const char* q)
{
    while(*p++=*q++);
}

int main(int argc, char *argv[])
{
    const char* str="abcderrasdfafawefwaeqweqweqweqdsasafw";

    char* str_copy;//Падает
    char* str_copy="c";//Падает

    char* str_copy=new char[1];//Работает


    cpy(str_copy,str);

    std::cout<<str_copy<<std::endl;
}


2 вопроса:
1. Правильны ли следующие рассуждения относительно первых двух объявлений str_copy? В первом случае указатель объявлен, но еще не инициализирован, т.е. фактически никуда не указывает ещё, поэтому и обращения к нему некорректны. Во втором случае str_copy объявлена как строковый литерал, т.е. как const char[2] и во-первых изменять значения такого массива нельзя, а во-вторых указатель выходит за рамки массива после 2.

2. Почему работает последний вариант? Ведь по идее надо бы выделить память следующим образом char* str_copy=new char[strlen(str)];

Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Алексей1153
  опции профиля:
сообщение 4.11.2011, 9:46
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


rp80, это не код, это полный пииип )))

а зачем вот это чудо тут ?

void cpy(char* p, const char* q)
{
    while(*p++=*q++);
}


а почему работает копирование в константу - это чистая случайность

Цитата
char* str_copy=new char[1];//Работает


тоже до поры до времени. Нет терминатора!

Сообщение отредактировал Алексей1153 - 4.11.2011, 9:45
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rp80
  опции профиля:
сообщение 4.11.2011, 9:55
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 10.9.2011
Пользователь №: 2860

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Алексей1153 @ 4.11.2011, 10:46) *
rp80, это не код, это полный пииип )))

а зачем вот это чудо тут ?

void cpy(char* p, const char* q)
{
    while(*p++=*q++);
}


Это не пиип, а пример expression-oriented coding из Страуструпа. Функция работает так как и задумано.

Цитата(Алексей1153 @ 4.11.2011, 10:46) *
а почему работает копирование в константу - это чистая случайность

Цитата
char* str_copy=new char[1];//Работает


тоже до поры до времени. Нет терминатора!


char* str_copy=new char[1] - не константа далеко. И терминатор в этой строке не нужен, потому что в нее копируем а не из нее.

Я уже в общем понял почему так происходит.. Хоть память выделена и под 1 чар, но за этим сегментом есть какие-то следующие, поэтому q++ существует и туда можно записать.
Но память все равно нужно выделять под весь массив, ибо иначе мы можем залезть в память , выделенную под другие объекты.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 20.6.2025, 23:47