【问题标题】:gcc throwing -Wint-to-pointer-cast despite the variable types are the same(from multiboot_uint64_t to multiboot_uint64_t*)gcc 抛出 -Wint-to-pointer-cast 尽管变量类型相同(从 multiboot_uint64_t 到 multiboot_uint64_t*)
【发布时间】:2020-07-23 04:09:26
【问题描述】:

这是触发警告的代码(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* 吗?它们的大小相同!

【问题讨论】:

    标签: c gcc-warning


    【解决方案1】:

    这个表达式

    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;
      ...
    }    
    

    【讨论】:

    • 我要fadr的值是public_mbd->framebuffer_addr的值,而不是public_mbd->framebuffer_addr的地址。
    • 那么就不要使用指针了。如果将fadr声明为multiboot_uint64_t fadr,不带任何指针,则可以直接将public_mbd->framebuffer_addr的值赋值给fadr
    • @ClementPoon 所以你的设计有问题。如果您想要指向multiboot_uint64_t 的指针,为什么要使用multiboot_uint64_t
    • 可能是结构设计的不好,我会补充答案...
    【解决方案2】:

    问题不在于faddr。问题在于演员阵容。

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

    【讨论】:

      猜你喜欢
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多