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_mbd
是 struct 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;
...
}
这是触发警告的代码(public_mbd
是 struct 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;
...
}