【问题标题】:How to resolve: "cast to pointer from integer of different size" warning in C code?如何解决:C代码中的“从不同大小的整数转换为指针”警告?
【发布时间】:2012-08-01 13:44:04
【问题描述】:

我正在从旧代码中删除 gcc 警告。

是否可以通过类型转换抑制警告“从不同大小的整数转换为指针”:

example:

some_struct *ptr = func()  // func() returns an integer.

有人可以指导我如何解决此类 gcc 警告吗?

【问题讨论】:

  • 为什么要将整数放入结构指针中?
  • 这是可能的,但正确的做法很少见。
  • “输出”差异是否超载?(不是输入参数)

标签: c pointers gcc-warning


【解决方案1】:

首先,如果你能修复func(允许修改其来源),然后修复它。如果它的计算可以用指针来完成,那么用指针来做它们并返回指针。有时有充分的理由将地址作为整数使用(例如,处理特殊代码中的对齐问题)。在这种情况下,将func 更改为使用uintptr_t 类型(在stdint.h 中定义)。它旨在在必要时将指针视为整数。 (还有 intptr_t 如果有符号算法由于某种原因更好,但我通常发现无符号 uintptr_t 不那么麻烦。)最好,func 应该在返回时将 uintptr_t 转换为指针,所以func 的返回类型将是一个指针(指向某个东西,可能是 some_structvoid)。

如果您无法修复func,那么您可以使用强制转换告诉编译器您打算执行正在执行的转换。但是,此特定错误消息告诉您,您不仅将整数转换为指针,而且将一种大小(例如,四个字节)的整数转换为另一种大小(例如,八个字节)的指针。很可能这段代码最初是为func 返回的整数类型与指针类型具有相同大小的系统编写的,但您现在正在一个指针类型大于或小于该整数大小的系统上进行编译。

在这种情况下,您必须确保func 执行的计算在新架构中有效。如果它只返回一个 32 位的值,它会始终保持正确的值吗?也就是说,丢失的高 32 位不会丢失任何东西? func 应该计算的地址没有超过它使用的整数类型的最大值?如果func 使用有符号整数类型,也要考虑符号位。

如果你确保func返回的值是正确的,那么你可以使用显式转换,例如:some_struct *ptr = (some_struct *) (intptr_t) func();

【讨论】:

    【解决方案2】:

    我的 gcc 没有给出你引用的警告。这也会很奇怪,因为您的代码中没有演员表。

    我收到警告

    assignment makes pointer from integer without a cast
    

    注意“没有演员表”部分。因此,您可以通过强制转换(不改变行为)使 gcc 保持沉默:

    some_struct *ptr = (void*)func();
    

    然后,如果func 的返回类型不适合地址,您将收到警告(“从不同大小的整数转换为指针”)。这可以通过另外将func() 转换为合适的整数类型来消除,例如intptr_t:

    some_struct *ptr = (void*)(intptr_t)func();
    

    所有这些都假设您真的想将错误大小的整数转换为指针。可能,重写代码是一个更好的主意。

    【讨论】:

      【解决方案3】:

      这里有两种可能:

      1. func 将实际指针转换为整数;它后来被用作指针。
      2. func 正在返回一个存储在指针中的整数; ptr 稍后被转换为整数并用作整数。

      在第一种情况下,func 的返回值将丢失信息,如果int 小于数据指针的大小,则可能会崩溃或更糟,它将是在大多数 64-bit memory models(包括 Windows 和 Linux)上。在这种情况下,您应该将func 的返回类型更改为intptr_t;见Using intptr_t instead of void*?Why / when to use `intptr_t` for type-casting in C?

      在第二种情况下,问题不大,但要处理字节顺序问题,您应该通过intptr_tsome_struct *ptr = (some_struct *)(intptr_t)func(); 和后来的int value = (int)(intptr_t)ptr; 进行转换。有关该问题的讨论,请参阅 GLib Type Conversion Macros

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-14
        • 2011-08-07
        • 2019-08-13
        • 1970-01-01
        相关资源
        最近更新 更多