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

维基百科

在下面的代码中,为什么需要(VOID *)在指针中间进行转换?

一些上下文定义:

#define VOID      void
typedef unsigned char       UINT8;


ErrorDest = (EFI_ACPI_6_0_GENERIC_HARDWARE_ERROR_SOURCE_STRUCTURE *)
            (VOID *)
            ((UINT8 *)Hest + Hest->Header.Length);
克拉斯·林贝克

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

UINT8 没有对齐要求。

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

Avoid*可以指向任何地址,但是当将其强制转换为另一种指针类型时,即使该类型可能有对齐要求,也可以免于对齐警告。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么从引用到c_void指针的转换需要双重转换?

为什么需要指针类型转换?

将 void 双指针类型转换为 void,为什么?

为什么从void指针*强制转换的数组无法迭代for循环?

允许强制转换为void(非指针),为什么?

为什么不能将函数指针转换为(void *)?

为什么将指向int的指针转换为void *但将指向函数的指针转换为bool?

为什么在将值打印到地址位于指针中的内存中之前,必须将void指针强制转换为int或其他内容?

为什么指针需要类型?

将int转换为指针-为什么先转换为long?(如p =(void *)42;)

在C ++中,为什么需要提及指针的类型?

为什么在SFINAE期间需要参数中的指针?

为什么在将 void 指针转换为指向 char 指针的指针后取消引用会产生问题?

为什么在printf中使用指针时强制转换为(void *)p?

强制转换中的中间指针必须是“ const限定”的-为什么?

为什么在使用指针初始化用户定义的结构时需要键入强制类型转换?

为什么在将其强制转换为void *类型之前需要复制Objective-C处理程序?

为什么不能将lambda强制转换为void *,然后再强制转换为函数指针?

C中的增量强制转换void指针

函数指针中 void* 参数的自动转换

为什么我需要双指针?

为什么以及何时需要双指针?

为什么将指针传递给具有常量指针类型参数的函数时不需要类型转换?

在OpenGL中,为什么glVertexAttribPointer要求将“指针”参数作为void *传递?

为什么插入列表需要指向指针的指针

为什么要转换为空指针?

为什么在将未初始化的volatile指针转换为`void`时GCC会发出警告?

C中的指针:为什么获取x的地址时* address_of_x =&x中需要*?

为什么我们需要指针为Go / C中的变量分配值,而不是C#/ Java中的指针