这可能相当简单,但我有一个方法,希望参数是类型 BYTE ** Ptr
由于各种原因,我在调用此方法的代码中使用int *(我们将在此示例中调用intPtr
),因此我想知道这样做是否安全:
MethodCall((BYTE**) &intPtr, ...
该方法将图像缓冲区锁定到位并向其提供BYTE *,以便一旦锁定缓冲区,它就会将指针设置为指向内存中锁定缓冲区的开始。这是Windows Media Foundation代码的一部分,因此无法轻松更改以适应我的int *。
上面的转换是否会使我的intPtr
仍然指向调用后的锁定缓冲区内存地址,就像它是请求的BYTE *一样。这样做有什么危险吗?
答案 0 :(得分:2)
一般来说,这不是“安全”。虽然可以将指向T
的指针转换为指向 - U
并再返回指针,但通过指针指向U
修改它至多是实现定义的
在您的示例中,该方法将修改您的int *
以指向某个内存,但不能保证它会选择一些正确对齐int
的内存。这将导致所谓的“一团糟”。
答案 1 :(得分:0)
实际上,在Windows上,这可能会起作用,因为BYTE*
和int*
具有相同的大小。一般来说,虽然这是未定义的行为,并且没有理由为什么不同类型的指针应该具有相同的大小 - 唯一保证适合任何其他指针的指针是void*
。
答案 2 :(得分:0)
是的,如果你不是向下转换类指针,这是危险的。它可以在这种情况下裁剪为int值。
在这种情况下BYTE**
是指向指针或指针数组的指针,因此从int中转换它是危险的,函数可能会破坏内存的其他部分。