HgLab: Mercurial Server and Repository Management for Windows
Re[2]: указатели
От:
Аноним
Дата:
27.08.04 08:30
Оценка:
Здравствуйте, Burd, Вы писали:
B>value[9]=0
не, так не выходит.
void Func(BYTE** value)
{
*value = (BYTE*) malloc (10);
if(value)
{
тут я в value записываю данные.
причем размер этих данных фиксирован и равен 10
но после записи в конец дописывается еще какая-то произвольная пурга.
так вот как избавиться от этой пурги???
}
}
> void Func(BYTE** value) > { > *value = (BYTE*) malloc (10); > if(value) > { > тут я в value записываю данные. > причем размер этих данных фиксирован и равен 10 > но после записи в конец дописывается еще какая-то произвольная пурга. > так вот как избавиться от этой пурги??? > } > }
1) Каким образом заполняется value?
2) "Произвольная пурга" сама никогда не дописывается.
Здравствуйте, alexej_zarva, Вы писали:
>> void Func(BYTE** value) >> { >> *value = (BYTE*) malloc (10); >> if(value) >> { >> тут я в value записываю данные. >> причем размер этих данных фиксирован и равен 10 >> но после записи в конец дописывается еще какая-то произвольная пурга. >> так вот как избавиться от этой пурги??? >> } >> }
Я кажись понял. А кто под двойной указатель память выделяет?
value = (BYTE**) malloc (1 * sizeof(BYTE**));
По-моему так, уважаемые господа програмисты, или я опять не прав?
Любая задача имеет решение, даже когда решения не существует
Здравствуйте, Burd, Вы писали:
B>Я кажись понял. А кто под двойной указатель память выделяет?
B>value = (BYTE**) malloc (1 * sizeof(BYTE**));
Бррр
Смотрите, в функцию параметр приходит не по ссылке (&), он передается по значению. Это означает, что у вас будет утечка памяти при выходе из функции. Чтобы работал ваш вариант, функция должна была бы быть обявлена хотя как Func(BYTE**& value)
Передача в параметре указателя на указатель означает, что в функцию приходит не 0 (NULL), а адрес на какую-то переменную длиной sizeof(BYTE*), т.е. адрес переменной типа указатель на BYTE.
Т.е. в начале функции надо обязательно проверить, что пришел не 0, хотя бы в отладочной версии:
assert(value != 0);
В языке С++ это можно было бы записать как BYTE*& rValue.