Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Инициализация указателей, переданных в параметрах, запутался 
:(
    Опции темы
Dov
Дата 21.5.2007, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Цитата(INHazeR @ 21.5.2007,  12:23)
Гм. Все-таки непонятно, как по данному адресу (переданному в параметре функции) выделить память и заполнить ее значениями. Варианты типа
void Foo(char* s, int* p)
Код

{
    s = "lala";
    s = "lala\0";
    s = new char[4];
}


не годятся, насколько я понимаю, так как адрес (s) сам по себе неизменен, этот указатель создали где-то вне функции и передали сюда, так что присваивать ему новое значение внутри функции бессмысленно, разве не так? При выходе из функции он снова примет прежнее значение, а выделенная нами память останется мертвым грузом где-то в куче.
По-моему, необходимо выделить память по заданному адресу, а не найти память и присвоить адрес начального байта этой памяти в указатель... или я ошибаюсь?


INHazeR, а ты попробуй адрес указателя передавать. Может чего и выйдет.
Насколько я понял, у тебя есть какой-то указатель. Например, есть такой код:
Код

int main(void)
{
    char* str;    

    return 0;    
}

Добавь ф-цию:
Код

void Foo(char** s)
{
    *s = "lala";
}

и вызывай так:
Код
Foo(&str);


Добавлено через 4 минуты и 35 секунд
Если это С++, то можно ещё так:
Код

void Foo(char* &s)
{
    s = "lala";
}

int main(void)
{
    char* str = "qwerty";

    Foo(str);    

    return 0;    
}
 


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
archimed7592
Дата 21.5.2007, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Anikmar @  21.5.2007,  18:45 Найти цитируемый пост)
char *Buf = (char*) new(100);
Последнее выглядит несколько извращенно, но допустимо.
Соответственно, если такая функция чужая, и ее разработчик забыл указать, что удалять строку надо delete[], а не delete - вот тут как раз и возникнет UB, который мне не нравится.
ты наверное имел ввиду operator new (100) (иначе, просто не скомпилируется, имхо)... тогда нужен ни delete, ни delete [], а operator delete... smile

Цитата(Anikmar @  21.5.2007,  18:45 Найти цитируемый пост)
Было бы абсалютно логично, что блок должен удалиться по-любому, а вот вызов деструкторов - по желанию
было бы абсолютно логично писать по правилам... юзать smart pointer'ы, контейнеры и прочую лабуду, минимизирующую кол-во такого рода ошибок... ;)


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Anikmar
Дата 21.5.2007, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(archimed7592 @  21.5.2007,  22:40 Найти цитируемый пост)
ты наверное имел ввиду operator new (100) (иначе, просто не скомпилируется, имхо)... тогда нужен ни delete, ни delete [], а operator delete... 

Ну да, пример не совсем удачный, я забыл, что там надо operator добавлять
Цитата(archimed7592 @  21.5.2007,  22:40 Найти цитируемый пост)
было бы абсолютно логично писать по правилам... юзать smart pointer'ы, контейнеры и прочую лабуду, минимизирующую кол-во такого рода ошибок... ;) 

Истественно. Я просто про сторонню.ю функцию. Которая написана кем-то другим, и по возвращаемому значению сложно определить одиночный это указатель или массив. Допустим, функция достаточно важная, самому писать ее долго, как она выделяет память неясно, но ее надо освободить. Вот я и прикидываю, есть ли способ это определить имея на руках только указатель...
PM MAIL ICQ   Вверх
archimed7592
Дата 22.5.2007, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Anikmar @  21.5.2007,  22:52 Найти цитируемый пост)
Вот я и прикидываю, есть ли способ это определить имея на руках только указатель... 
в общем случае - нет... а вообще, "важная" ф-ция обязательно задокументирует способ, которым нужно вызывающей стороне освобождать память т. к. выделить её можно туевой хучей способов...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Anikmar
Дата 22.5.2007, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(archimed7592 @  22.5.2007,  02:00 Найти цитируемый пост)
а вообще, "важная" ф-ция обязательно задокументирует способ, которым нужно вызывающей стороне освобождать память

Ваши слова - да Богу в уши.
Помню времена MS-DOS.
Книжка у меня была - Описание недокументированных прерываний DOS. И ведь куча программ была, которые этим пользовались. ИМХО Это одна из дырок стандарта. Думаю ее будут потом исправлять. Если нужно держать связку операторов четко - должен быть способ узнать тип применяемого оператора. Если это пишет один человек - ерунда, сам должен следить. А вот если баг в описании чужой функции, да еще исходник недоступен. Тут ведь совместимость на двоичном уровне идет.
Ладно, вода все это. Вот когда такая ситуация возникнет - будем конкретно ее обсуждать. Сейчас у меня таких проблем нет, утечка памяти достаточно редкий случай - благо на этот счет инструментария разного достаточно.
PM MAIL ICQ   Вверх
v_nikolaev
Дата 24.5.2007, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 6.5.2007

Репутация: нет
Всего: нет



Цитата(INHazeR @ 21.5.2007,  00:45)
В случае с целыми числами сделал просто
Код

*(p) = 5;
*(++p) = 2;
*(++p) = 4;


а почему не написать красивее?

Код

*p++ = 5;
*p++ = 2;
*p++ = 4;


PM MAIL   Вверх
Fazil6
Дата 24.5.2007, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(v_nikolaev @  24.5.2007,  10:38 Найти цитируемый пост)
а почему не написать красивее?

потому что это не одно и тоже. Твой код совершенно другое будет делать
PM MAIL   Вверх
archimed7592
Дата 24.5.2007, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Fazil6 @  24.5.2007,  11:05 Найти цитируемый пост)
совершенно другое
ну не совершенно... всего-то p на один эл-т дальше будет сдвинут...


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
v_nikolaev
Дата 24.5.2007, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 6.5.2007

Репутация: нет
Всего: нет



Цитата(Fazil6 @ 24.5.2007,  11:05)
Цитата(v_nikolaev @  24.5.2007,  10:38 Найти цитируемый пост)
а почему не написать красивее?

потому что это не одно и тоже. Твой код совершенно другое будет делать

насколько я понимаю, разница тут только в том, что я сделал лишний раз ++.

*p++  -  сначала происхоит присвоение в нужную память, а потом ++ к указателю.

archimed7592  smile 

Это сообщение отредактировал(а) v_nikolaev - 24.5.2007, 11:17
PM MAIL   Вверх
Fazil6
Дата 24.5.2007, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(v_nikolaev @  24.5.2007,  11:11 Найти цитируемый пост)
*p++  -  сначала происхоит присвоение в нужную память, а потом ++ к указателю.

нет. Это унарные операторы. Сначала ++ , потом *.

PM MAIL   Вверх
archimed7592
Дата 24.5.2007, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Fazil6smile
ты согласен, что *p++ эквивалентно *(p++)?
вытекает из приоритетов операторов...

Это сообщение отредактировал(а) archimed7592 - 24.5.2007, 11:22


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Fazil6
Дата 24.5.2007, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(archimed7592 @  24.5.2007,  11:08 Найти цитируемый пост)
ну не совершенно... всего-то p на один эл-т дальше будет сдвинут...

ага, разница невелика (всего один элемент) и можно на эту разницу забить? Вобщем действительно , какая уж разница какой элемент массива менять... Особенно когда p на последний элемент указывает.

Добавлено @ 11:24
Цитата(archimed7592 @  24.5.2007,  11:21 Найти цитируемый пост)
ты согласен, что *p++ эквивалентно *(p++)?вытекает из приоритетов операторов...

согласен, тока в примере *p++ = 5  и *(++p) = 5  , а это не эквивалентно 

Это сообщение отредактировал(а) Fazil6 - 24.5.2007, 11:25
PM MAIL   Вверх
archimed7592
Дата 24.5.2007, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Fazil6 @  24.5.2007,  11:22 Найти цитируемый пост)
и можно на эту разницу забить?
никто не говорит, что забить можно... просто в данном конкретном случае никакой погоды это не делает... тем более, что, с тем же успехом, в последней строке можно не писать ++...
просто этот сдвиг не означает, что код делает совершенно другое...

Цитата(Fazil6 @  24.5.2007,  11:22 Найти цитируемый пост)
согласен, тока в примере *p++ = 5  и *(++p) = 5  , а это не эквивалентно 

блин, эквивалентны вот эти два примера в целом... а о построчной эквивалентности никто не утверждал
Код
*(p) = 5;
*(++p) = 2;
*(++p) = 4;
// эквивалентно
*p++ = 5;
*p++ = 2;
*p = 4;


Это сообщение отредактировал(а) archimed7592 - 24.5.2007, 11:30


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Fazil6
Дата 24.5.2007, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(archimed7592 @  24.5.2007,  11:21 Найти цитируемый пост)
ты согласен, что *p++ эквивалентно *(p++)?вытекает из приоритетов операторов...

Непоняли друг друга. Я немного не то хотел сказать. Я имел в виду, что пост и преинкремент разные результаты дадут и * применяется к разным адресам

PM MAIL   Вверх
archimed7592
Дата 24.5.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Fazil6 @  24.5.2007,  11:30 Найти цитируемый пост)
Я немного не то хотел сказать.
я отлично понял, что ты хотел сказать... вопрос только к чему ты это сказал? smile


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1122 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.