Является ли указатель приведение к параграфам метода удовлетворения опасным занятием? - PullRequest
0 голосов
/ 15 августа 2011

Это может быть довольно просто, но у меня есть метод, который ожидает, что параметр имеет тип BYTE ** Ptr

И по разным причинам я использую int * (мы будем вызывать intPtr дляэтот пример) в коде, который будет вызывать этот метод, поэтому мне было интересно, если это безопасно сделать:

 MethodCall((BYTE**) &intPtr, ...

Метод блокирует буфер изображения на месте, и вы предоставляете ему BYTE * такчто, как только он заблокировал буфер, он устанавливает указатель на начало заблокированного буфера в памяти.Это часть кода Windows Media Foundation и поэтому не может быть легко изменена в соответствии с моим int *.

Приведет ли приведенное выше приведение в действие, чтобы мой intPtr по-прежнему указывал на заблокированный адрес буферной памяти после вызова, как если бы это был БАЙТ * в соответствии с запросом.Кроме того, есть ли опасность сделать это?

Ответы [ 3 ]

2 голосов
/ 15 августа 2011

В общем, это не «безопасно».Хотя указатель на T может быть преобразован в указатель на U и обратно, его изменение с помощью указателя на U в лучшем случае определяется реализацией.

В вашем примере метод изменит ваш int * так, чтобы он указывал на некоторую память, но нет гарантии, что он выберет некоторую память, правильно выровненную для int.Это привело бы к так называемому «большому беспорядку».

0 голосов
/ 15 августа 2011

Да, это опасно, если вы не понижаете указатель класса. В этом случае может обрезаться значение int.

И в этом случае BYTE** является указателем на указатель или массив указателей, поэтому приведение его из int опасно, и функция может повредить другую часть памяти.

0 голосов
/ 15 августа 2011

Практически в Windows это, вероятно, сработает, поскольку BYTE* и int* имеют одинаковый размер. В целом, хотя это неопределенное поведение, и нет никаких причин, по которым указатели разных типов должны быть одинакового размера - единственный указатель, который гарантированно соответствует любому другому указателю, это void*.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...