【问题标题】:mud compile - warning: cast from pointer to integer of different size泥编译 - 警告:从指针转换为不同大小的整数
【发布时间】:2014-08-23 13:52:35
【问题描述】:

尝试在 Ubuntu 14.04 LTS 和 gcc 4.4.7 上编译 MUD(在线文本游戏),但我不断收到以下信息:

vt100.c:在函数“get_tactical_map”中:

vt100.c:1741:警告:从指针转换为不同大小的整数

vt100.c:1805:警告:从指针转换为不同大小的整数

上面每一行的代码都是一样的:

*pto++ = 'a' + ((int) fch % 25);

如果需要,我可以链接整个文件,只是不知道上传到哪里。

【问题讨论】:

  • fch 是如何声明的?
  • 整个文件会很有帮助。你从哪里得到的文件? (您无需再次上传,只需提供您从中获取的链接即可。)
  • 声明为:CHAR_DATA *fch;
  • 该文件可以在mudbytes.net/file-2644找到,它是src目录下的vt100.c。

标签: c mud


【解决方案1】:

我猜您正在尝试编译由不知道或不关心 C 语言在 64 位系统上的可移植性问题的人编写的 32 位代码。

问题在于,将指针转换为不能表示其值的整数是未定义的行为。见 C11 6.3.2.3 §6:

任何指针类型都可以转换为整数类型。 [...] 如果结果不能以整数类型表示,则行为未定义。

可移植代码将使用转换为 uintptr_t(或在 C99 之前的时代为 size_t)而不是 int

显然,指针持有的地址被用作随机源以获得任意小写字母(我认为 Mints97 不太可能是正确的,作者只是忘记取消引用指针,但没有更多代码,谁也说不准)。

如果您忽略警告,原则上,代码实际上可能会在整数溢出时引发信号的架构上崩溃。更可能的情况是可能无害的错误(取决于结果的使用方式):如果(int)fch 恰好为负数,您可能会得到一个特殊字符或大写字母,而不是小写字母。

【讨论】:

    【解决方案2】:

    如果没有变量声明,我不能说更多,但是当您将指针变量强制转换为非指针类型(例如,void *int)时,通常会发生此错误。在您的代码中,问题很可能出在(int) fch:fch 是一个指针,而您正试图将其转换为int。如果要提取fch指向的值,可以尝试使用(int) *fch,例如

    *pto++ = 'a' + ((int)*fch % 25);
    

    【讨论】:

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