указатели
От: Аноним  
Дата: 27.08.04 08:15
Оценка:
void Func(BYTE** value)
{
   *value = (BYTE*) malloc (10);
   if(value)
   {            
    как на десятую позицию value записать 0 (ноль)???
   }
}


спасибо.

27.08.04 13:48: Перенесено из 'WIN API'
Re: указатели
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 27.08.04 08:18
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>
А>void Func(BYTE** value)
А>{
А>   *value = (BYTE*) malloc (10);
А>   if(value)
А>   {            
А>    как на десятую позицию value записать 0 (ноль)???
А>   }
А>}
А>


А>спасибо.




value[9]=0
Любая задача имеет решение, даже когда решения не существует
Re: указатели
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 27.08.04 08:19
Оценка:
Здравствуйте, <Аноним>, Вы писали:

Вопрос с подвохом ?

А>
А>void Func(BYTE** value)
А>{
А>   *value = (BYTE*) malloc (10 * sizeof(BYTE));
А>   if(*value)
А>   {
А>        value[9] = 0; // ???            
А>   }
А>}
А>


А>спасибо.
... << Rsdn@Home 1.1.4 beta 1 >>
HgLab: Mercurial Server and Repository Management for Windows
Re[2]: указатели
От: Кодт Россия  
Дата: 27.08.04 08:24
Оценка: 4 (1) :)
Здравствуйте, Нахлобуч, Вы писали:

А>>void Func(BYTE** value)
А>>{
//и ещё неплохо бы делать контроль параметра:
  if(value == NULL) throw std::invalid_argumen("out-параметр - нулевой указатель :( ");

А>>   *value = (BYTE*) malloc (10 * sizeof(BYTE));
А>>   if(*value)
А>>   {
А>>//error        value[9] = 0; // ???            
         (*value)[9] = 0;
А>>   }
А>>}
Перекуём баги на фичи!
Re[2]: указатели
От: Аноним  
Дата: 27.08.04 08:30
Оценка:
Здравствуйте, Burd, Вы писали:

B>value[9]=0

не, так не выходит.

void Func(BYTE** value)
{
   *value = (BYTE*) malloc (10);
   if(value)
   {            
    тут я в value записываю данные.
    причем размер этих данных фиксирован и равен 10
    но после записи в конец дописывается еще какая-то произвольная пурга.
    так вот как избавиться от этой пурги???
   }
}
Re[3]: указатели
От: Аноним  
Дата: 27.08.04 09:11
Оценка:
Здравствуйте, Аноним, Вы писали:

неужели никто не знает???
Re[3]: указатели
От: alexej_zarva  
Дата: 27.08.04 09:22
Оценка:
> void Func(BYTE** value)
> {
> *value = (BYTE*) malloc (10);
> if(value)
> {
> тут я в value записываю данные.
> причем размер этих данных фиксирован и равен 10
> но после записи в конец дописывается еще какая-то произвольная пурга.
> так вот как избавиться от этой пурги???
> }
> }

1) Каким образом заполняется value?
2) "Произвольная пурга" сама никогда не дописывается.
Posted via RSDN NNTP Server 1.9 beta
Re[4]: указатели
От: rus blood Россия  
Дата: 27.08.04 09:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>неужели никто не знает???


Тебе же популярно объяснили
Автор: Кодт
Дата: 27.08.04
...
value — это указатель на переменную, в которой возвращается указатель на выделенный буфер.
Тебе надо не value[9] использовать, а (*value)[9].
Имею скафандр — готов путешествовать!
Re[4]: указатели
От: Burd Украина http://proxysearcher.sourceforge.net
Дата: 28.08.04 06:39
Оценка:
Здравствуйте, alexej_zarva, Вы писали:

>> void Func(BYTE** value)

>> {
>> *value = (BYTE*) malloc (10);
>> if(value)
>> {
>> тут я в value записываю данные.
>> причем размер этих данных фиксирован и равен 10
>> но после записи в конец дописывается еще какая-то произвольная пурга.
>> так вот как избавиться от этой пурги???
>> }
>> }

Я кажись понял. А кто под двойной указатель память выделяет?

value = (BYTE**) malloc (1 * sizeof(BYTE**));

По-моему так, уважаемые господа програмисты, или я опять не прав?
Любая задача имеет решение, даже когда решения не существует
Re[5]: указатели
От: Xentrax Россия http://www.lanovets.ru
Дата: 28.08.04 07:19
Оценка:
Здравствуйте, Burd, Вы писали:

B>Я кажись понял. А кто под двойной указатель память выделяет?


B>value = (BYTE**) malloc (1 * sizeof(BYTE**));


Бррр

Смотрите, в функцию параметр приходит не по ссылке (&), он передается по значению. Это означает, что у вас будет утечка памяти при выходе из функции. Чтобы работал ваш вариант, функция должна была бы быть обявлена хотя как Func(BYTE**& value)

Передача в параметре указателя на указатель означает, что в функцию приходит не 0 (NULL), а адрес на какую-то переменную длиной sizeof(BYTE*), т.е. адрес переменной типа указатель на BYTE.

Т.е. в начале функции надо обязательно проверить, что пришел не 0, хотя бы в отладочной версии:

assert(value != 0);



В языке С++ это можно было бы записать как BYTE*& rValue.


void Func(/* out */ BYTE*& value)
{
...
}
Re: указатели
От: GarryIV  
Дата: 28.08.04 07:35
Оценка: -1 :))
Hello, !

> как на десятую позицию value записать 0 (ноль)???


Любимый ответ конфы — "Используйте stl"

WBR, Igor Evgrafov.
Posted via RSDN NNTP Server 1.9 beta
WBR, Igor Evgrafov
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.