指针铸造是否满足方法参数危险的事情要做什么?

时间:2011-08-15 18:30:07

标签: c++ pointers casting

这可能相当简单,但我有一个方法,希望参数是类型      BYTE ** Ptr

由于各种原因,我在调用此方法的代码中使用int *(我们将在此示例中调用intPtr),因此我想知道这样做是否安全:

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

该方法将图像缓冲区锁定到位并向其提供BYTE *,以便一旦锁定缓冲区,它就会将指针设置为指向内存中锁定缓冲区的开始。这是Windows Media Foundation代码的一部分,因此无法轻松更改以适应我的int *。

上面的转换是否会使我的intPtr仍然指向调用后的锁定缓冲区内存地址,就像它是请求的BYTE *一样。这样做有什么危险吗?

3 个答案:

答案 0 :(得分:2)

一般来说,这不是“安全”。虽然可以将指向T的指针转换为指向 - U并再返回指针,但通过指针指向U修改它至多是实现定义的

在您的示例中,该方法将修改您的int *以指向某个内存,但不能保证它会选择一些正确对齐int的内存。这将导致所谓的“一团糟”。

答案 1 :(得分:0)

实际上,在Windows上,这可能会起作用,因为BYTE*int*具有相同的大小。一般来说,虽然这是未定义的行为,并且没有理由为什么不同类型的指针应该具有相同的大小 - 唯一保证适合任何其他指针的指针是void*

答案 2 :(得分:0)

是的,如果你不是向下转换类指针,这是危险的。它可以在这种情况下裁剪为int值。

在这种情况下BYTE**是指向指针或指针数组的指针,因此从int中转换它是危险的,函数可能会破坏内存的其他部分。