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


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

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

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




Репутация:   34  


BRE, неважно, что там два прохода. Зато читаемость :) А оптимизировать там, где это нифига не явно - не нужно, лучше пусть читаемость будет. То есть всё поближе к ООП.

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

А кроме того, предлагаю сделать тестик и замерить скорость выполнения обоими способами - не факт, что мой будет медленнее :)

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

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


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


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


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