![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Размер данных по указателю
looser © (2014-06-30 18:30:00)Здравствуйте! Возщможно ли определение размера структуры, на которую указывает указатель?
Dennis I. Komarov (2014-07-04 09:22:00) [1]
> а по другому как?
Ну одно дело протокол обмена и совсем другое внутри приложения...
Rouse__ (2014-07-03 21:35:00) [2]Да вот еще, а по другому как? ;)
Dennis I. Komarov (2014-07-03 21:15:00) [3]Сань, потри... разве можно так плохому учить? :))))
Inovet (2014-07-03 01:18:00) [4]> [20] looser (02.07.14 23:44)
> Но, честно говоря, так и не понял рекоммендаций мастеров)
> )
Первым полем сделать sizeof(Эта_Структура_Или_Запись_по_паскалевски)
looser (2014-07-02 23:44:00) [5]Спасибо за ответы! Но, честно говоря, так и не понял рекоммендаций мастеров)) Пока сделал отдельный массив с размерами структур и проверяю при попытке заполнения... Не знаю, канонически правильно или нет, но, вроде, работает
Юрий Зотов (2014-07-01 22:54:00) [6]Саш, здесь не требуется проверки на отказ и прочих выкрутасов. Нужно просто решить конкретную задачу, без всяких фейков. Думаю, у тебя нет сомнений в том, что можно прочитать из буфера 4 байта, потом выделить память уже известного размера и потом записать в нее все остальное.
А код в [15], конечно, не рабочий, он только показывает способ. О чем и написано в [16].
Rouse_ (2014-07-01 21:19:00) [7]ЗЫ: тем более ты сам наглядно продемонстрировал в [15] как можно убить память, при чтении такого пакета.
Rouse_ (2014-07-01 20:52:00) [8]
> Юрий Зотов © (01.07.14 15:22) [14]
> > looser (01.07.14 12:47) [12]
>
> Если первые 4 байта пакета (структуры) отвести под его длину,
> то проблема исчезает.
Дядь Юр - это наоборот великая проблема, с учетом [12].
Разбирая различные протоколы передачи данных и натыкаясь при этом на структуры, в которых первыми 4 байтами идет размер пакета, я всегда начинаю проверять сей протокол на отказ, формируя фейковый пакет, в котором первые 4 байта содержат FFFFFFFF - как правило 80 процентов сетевых сервисов падают, пытаясь выделить память в 4 гига, из оставшихся процентов 8-10 перестают отвечать, переключаясь на прием данных такого размера, и только маааахонькое количество продолжает работать нормально, как правило это те, которые страхуются от "пережора" :)
Юрий Зотов (2014-07-01 20:38:00) [9]Точнее, не совсем так, конечно. Но мысль, думаю, ясна.
Юрий Зотов (2014-07-01 19:22:00) [10]Имелось в виду вот что:
move(buff, PointersArray[idPacketNum]^, Integer(PointersArray[idPacketNum]^)
Юрий Зотов (2014-07-01 15:22:00) [11]> looser (01.07.14 12:47) [12]
Если первые 4 байта пакета (структуры) отвести под его длину, то проблема исчезает.
looser (2014-07-01 12:50:00) [12]Точнее так move(buff, PointersArray[idPacketNum]^, NumOfBytes)
looser (2014-07-01 12:47:00) [13]Спасибо за ответ. В общем у меня реализуется конечный автомат, который разбирает байты по пакетам( структурам) и по выполнении условий заполняет структуру данными. Но хотелось бы еще подстраховаться при выполнении move(buff, Packet1, NumOfBytes)
Юрий Зотов (2014-07-01 12:30:00) [14]> Возможно ли определение размера структуры, на которую указывает
> указатель?
Если известно объявление этой структуры, то запросто. А если неизвестно, то либо невозможно, либо можно попробовать добраться до менеджера памяти и посмотреть, сколько памяти он выделял по этому адресу (если он вообще ее выделял). Но как сказал Розыч - не советую. Лучше поискать другое решение.
looser (2014-07-01 09:28:00) [15]Всё понял, просто для конкретного случая мне очень удобно было так: SizeOf(MyPointrer^)
Германн (2014-07-01 02:42:00) [16]
> Дело в том, что указатель может указывать вообще в произвольное
> место в памяти
Дело в том что указатель всегдаесть только адрес в памяти и не более того. И он вообще ничего и не на что не указывает, если не оговорено особо.
DVM (2014-07-01 00:31:00) [17]
> looser (30.06.14 18:30)
> Здравствуйте! Возщможно ли определение размера структуры,
> на которую указывает указатель?
Дело в том, что указатель может указывать вообще в произвольное место в памяти, в середину структуры, например.
Германн (2014-06-30 23:08:00) [18]
> Rouse_ © (30.06.14 19:40) [5]
>
>
> > Германн © (30.06.14 19:38) [4]
> > Нетипизированный указатель не указывает ни на какую структуру.
>
>
> Слишком много "не" ;)
Меньше никак низзя :)
looser (2014-06-30 21:15:00) [19]Спасибо за ответы! Очень жаль, что нет тривиального способа, а так красиво было ..(((
Rouse_ (2014-06-30 19:40:00) [20]
> Германн © (30.06.14 19:38) [4]
> Нетипизированный указатель не указывает ни на какую структуру.
Слишком много "не" ;)