尝试在 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);
如果需要,我可以链接整个文件,只是不知道在哪里上传。
我猜您正在尝试编译由不知道或不关心 C 语言在 64 位系统上的可移植性问题的人编写的 32 位代码。
问题在于将指针转换为不能表示其值的整数是未定义的行为。见 C11 6.3.2.3 §6:
任何指针类型都可以转换为整数类型。[...] 如果结果不能以整数类型表示,则行为未定义。
可移植代码将使用强制转换为uintptr_t
(或size_t
在 C99 之前的时代)而不是int
.
显然,指针持有的地址被用作随机源来获取任意小写字母(我认为Mints97不太可能是正确的,作者只是忘记取消引用指针,但没有更多代码,没有人可以肯定地说)。
如果您忽略警告,原则上,代码实际上可能会在整数溢出时引发信号的架构上崩溃。(int)fch
更可能的情况是一个可能无害的错误(取决于如何使用结果):如果碰巧是负数,您可能会得到一个特殊字符或大写字母,而不是小写字母。
如果没有变量声明,我不能说更多,但是当您将指针变量强制转换为非指针类型(例如,void *
to int
)时,通常会发生此错误。在您的代码中,问题很可能出在(int) fch
: fch 是一个指针,并且您正试图将其转换为int
. 如果要提取fch
指向的值,请尝试使用(int) *fch
,例如
*pto++ = 'a' + ((int)*fch % 25);