【问题标题】:Getting the warning "cast to pointer from integer of different size" from the following code从以下代码中获取警告“从不同大小的整数转换为指针”
【发布时间】:2011-08-07 18:30:03
【问题描述】:

代码是:

           Push(size, (POINTER)(GetCar(i) == term_Null()? 0 : 1));

这里是 C code push 返回ABC

 typedef POINTER  *ABC
 typedef void * POINTER
 ABC size;
 Push(ABC,POINTER);
 XYZ GetCar(int);
 typedef struct xyz *XYZ;
 XYZ term_Null(); 
 long int i;

特定警告的原因是什么?

【问题讨论】:

  • 是 sizeof(int)==sizeof(void*) 在你的平台上吗?
  • no int 的大小和 void 指针 ** 的大小不同。所以我使用 **long int.
  • 那么您对这条消息有什么不明白的地方?您将 int 转换为指针类型,您知道它们具有不同的大小,并且消息再次告诉您。看起来很清楚,不是吗?

标签: c gcc gcc-warning


【解决方案1】:

你想做什么? 指针不是整数,根据具体情况,您正试图从01 中创建一个指针。这是违法的。


如果您尝试将指针传递给包含01ABC,请使用:

ABC tmp = GetCar(i) == term_Null()? 0 : 1;
Push(size, &tmp);

【讨论】:

  • 我做了你在这里提到的那个。但我仍然收到同样的警告。你能告诉我还有什么原因吗?
  • 你能给我们完整的警告和更大的代码块吗?您可以将它们粘贴到here
  • 嗨,我将 01 类型转换为 long int,它对我有用。感谢您的帮助
  • Push(size, &ABC); 不是一个有效的语句(ABC 是一个类型,而不是一个变量...)
【解决方案2】:

您正在尝试将整数值(0 或 1)强制转换为 void 指针。

此表达式始终是一个值为 0 或 1 的 int:(GetCar(i) == term_Null()? 0 : 1)

然后您尝试将其强制转换为 void 指针 (POINTER) (typedef void * POINTER)。

这是非法的。

【讨论】:

  • 正是我说的。
  • @nightcracker - 我同意你的回答,但我在发布我的帖子后才看到你的帖子。
  • MByD:哦,好吧,我个人总是点击“加载新答案”:)
【解决方案3】:

由于这个问题使用与您的 32 位到 64 位移植问题相同的 typedef,我假设您使用的是 64 位指针。正如 MByd 所写,您将 int 转换为指针,并且由于 int 不是 64 位,您会收到该特定警告。

【讨论】:

    【解决方案4】:

    您可以使用intptr_t 来确保整数与指针具有相同的宽度。这样,您无需发现有关您的特定平台的信息,它也可以在另一个平台上运行(与 unsigned long 解决方案不同)。

    #include <stdint.h>
    
    Push(size, (POINTER)(intptr_t)(GetCar(i) == term_Null()? 0 : 1));
    

    取自 C99 标准:

    7.18.1.4 能够保存对象指针的整数类型

    1 以下类型指定一个签名 具有以下属性的整数类型 任何指向 void 的有效指针都可以是 转换为这种类型,然后转换 回到指向 void 的指针,然后 结果将比较等于 原指针:

    intptr_t

    【讨论】:

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