在下面的代码中,为什么需要(VOID *)在指针转换的中间?
一些上下文定义:
#define VOID void
typedef unsigned char UINT8;
ErrorDest = (EFI_ACPI_6_0_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE *)
(VOID *)
((UINT8 *)Hest + Hest->Header.Length);
Run Code Online (Sandbox Code Playgroud)
我能看到的唯一原因是阻止编译器发出有关指针对齐的警告.
UINT8 没有对齐要求.
A struct可以根据其成员具有其他对齐要求.通常,结构的对齐要求与其成员的最大对齐要求相同.如果EFI_ACPI_6_0_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE是opaque类型(即,它已声明,但其成员未知),或者如果它包含具有对齐要求的成员,则编译器可能会发出有关对齐的警告.
A void*可以指向任何地址,但是当它被转换为另一个指针类型时,即使该类型可能具有对齐要求,它也不会出现对齐警告.