如何解决:“转换为C代码中的不同大小的整数的指针”警告?

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

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

example:

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

有人可以请指导我如何解决这样的gcc警告?


首先,如果你可以修复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();


我的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();

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


这里有两种可能性:

  • func正在将一个实际指针转换为一个整数; 它稍后用作指针。
  • func返回一个存储在指针中的整数; ptr后来被转换为整数并用作整数。
  • 在第一种情况下,如果int小于数据指针的大小,那么func的返回值将丢失信息,并且可能会崩溃或更糟糕,它将在大多数64位内存模型(包括Windows和Linux)上运行。 在这种情况下,您应该将func的返回类型更改为intptr_t ; 请参阅使用intptr_t而不是void *? 以及为什么/何时使用`intptr_t`在C中进行类型转换?

    在第二种情况下,它不是一个问题,而是处理你应该通过intptr_t some_struct *ptr = (some_struct *)(intptr_t)func();字节顺序问题: some_struct *ptr = (some_struct *)(intptr_t)func(); 后来int value = (int)(intptr_t)ptr; 。 请参阅GLib类型转换宏来讨论这个问题。

    链接地址: http://www.djcxy.com/p/4859.html

    上一篇: How to resolve: "cast to pointer from integer of different size" warning in C code?

    下一篇: Specifically, what's dangerous about casting the result of malloc?