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, 12:17
Сообщение #2


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

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

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




Репутация:   34  


rp80, ну что ж, успехов )




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


это не константа, я не про эту строку говорил :)



а вот нечитаемое это безобразие
Цитата
while(*p++=*q++);


надлежит заменять на человеческий код
::memmove(p,q,::strlen(q)+1);


Сообщение отредактировал Алексей1153 - 4.11.2011, 18:56
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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


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


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