为什么需要指针转换中的(void*)?

smw*_*dia 4 c pointers

在下面的代码中,为什么需要(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)

Kla*_*äck 8

我能看到的唯一原因是阻止编译器发出有关指针对齐的警告.

UINT8 没有对齐要求.

A struct可以根据其成员具有其他对齐要求.通常,结构的对齐要求与其成员的最大对齐要求相同.如果EFI_ACPI_6_0_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE是opaque类型(即,它已声明,但其成员未知),或者如果它包含具有对齐要求的成员,则编译器可能会发出有关对齐的警告.

A void*可以指向任何地址,但是当它被转换为另一个指针类型时,即使该类型可能具有对齐要求,它也不会出现对齐警告.