gcc throwing -Wint-to-pointer-cast 尽管变量类型相同(从 multiboot_uint64_t 到 multiboot_uint64_t*)

gcc throwing -Wint-to-pointer-cast despite the variable types are the same(from multiboot_uint64_t to multiboot_uint64_t*)

这是触发警告的代码(public_mbdstruct multiboot_info):

multiboot_uint64_t* fadr;
fadr=(multiboot_uint64_t*)public_mbd->framebuffer_addr;

framebuffer_addr的定义和结构如下:

struct multiboot_info{
...
multiboot_uint64_t framebuffer_addr;
...
} 

gcc 说:

warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]

我对此感到非常困惑。 fadr 不是 multiboot_uint64_t* 吗?它们大小相同!

问题不在于 faddr。问题出在演员表上。

从类型可以看出 multiboot_uint64_t framebuffer_addr 是 64 位。从警告中我们可以猜测您的构建的指针是 32 位的。所以警告告诉你你正在将 64 位 int 转换为 32 位指针。

这个表达式

public_mbd->framebuffer_addr

属于

类型
multiboot_uint64_t

您尝试将其转换为类型 (multiboot_uint64_t*),即 指针 指向 multiboot_uint64_t。看起来在您的体系结构中,类型 multiboot_uint64_t 和指针具有不同的大小,但这并不重要;从类型直接转换为指向该类型的指针几乎从来都不是正确的做法。

也许您希望变量 fadr 指向 public_mbd->framebuffer_addr。这可以通过

实现
fadr = &(public_mbd->framebuffer_addr);

或者,当然,您可以完全避免指针并编写

multiboot_uint64_t fadr;
fadr = public_mbd->framebuffer_addr;

另一种可能是结构指定不正确。如果您希望 framebuffer_addr 字段本身是一个指针,您可以编写

struct multiboot_info{
  ...
  multiboot_uint64_t* framebuffer_addr;
  ...
}