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