此代码在 xlC 8.0(在 AIX 5.3 上)中编译时会产生错误的结果。它应该打印 12345, ,而是打印 804399880。删除 const 在...前面 result 使代码正确工作。

错误在哪里?

#include <stdio.h>
#include <stdlib.h>
#include <string>

long int foo(std::string input)
{
        return strtol(input.c_str(), NULL, 0);
}

void bar()
{
        const long int result = foo("12345");
        printf("%u\n", result);
}

int
main()
{
        bar();
        return 0;
}

编译命令:

/usr/vacpp/bin/xlC example.cpp -g

编辑:将上面的 printf 格式字符串更改为“%ld ”没有帮助。编辑2:使用的 AIX 版本是 5.3,而不是 6.1。

有帮助吗?

解决方案

10.0了xlC作品细,似乎是一个编译器故障

其他提示

这是标记C ++,所以会发生什么,当你使用的cout代替了printf?

它看起来像这个问题是你告诉printf的打印一个unsigned int,然后发送一个签名长整型实际打印。最有可能的内存布局是不同和printf无法理解你真正想做的事。

为什么 const 很重要,需要一些猜测,但我们可以做出合理的假设。

具有块作用域的变量,例如 result 可以分配到寄存器或放入堆栈。影响寄存器是否使用的因素有很多。很有可能 const 在这种情况下很重要。最后,编译器有权使用它认为最有效的东西。

类似地,函数的参数可以在寄存器或堆栈上传递。由于函数通常是单独编译的,因此它们的接口(即声明)指示哪个参数去哪里。printf(...) 是一种特殊情况,因为可以使用不同类型的参数调用它。因此,数据的最终位置会有所不同,并且您需要告诉 printf(...) 会发生什么。

现在,当将变量传递给函数时,编译器通常必须复制它。从寄存器到堆栈,从一个寄存器到另一个寄存器,等等,可能存在多种变化。正如我所指出的,源位置可能会有所不同,具体取决于是否存在 const.

现在,碰巧您将错误的格式说明符传递给 printf(...), ,即 %u 代替 %ld. 。这可能会导致 printf(...) 在错误的位置查找以获取其数据 - 可能是在寄存器而不是堆栈中,或者反之亦然。这样的行动可能会导致相当令人惊讶的结果。 printf(...) 例如,可能会偶然发现您未复制的 result, ,或某个寄存器中的随机旧值。似乎在非常量情况下它碰巧找到了正确的值(即使它可能在错误的地方找到了它),而在常量情况下 printf(...) 只是发现垃圾。

也许没有关系,但要小心:ü说明符的printf的%表示无符号整数,但你传递一个符号整数

克++处理此就好和未提及的警告。它不抱怨的printf。你应该使用%鲁为长整型。或甚至更好,使用%LD或铸造至(unsigned long int类型)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top