strtol在调试和发布模式方面有所不同

时间:2013-11-08 10:19:31

标签: c++ visual-studio-2008

我在使用visual studio 2008进行c ++编译时使用以下代码:

char input = 'K';
long output= strtol(&input , NULL, 36);

在调试模式下工作正常,输出为20 但在发布模式下,它会产生奇怪的输出,如604663109 当我设置禁用代码优化时,它也可以工作,但这不是解决方案 我也知道,如何手工计算,但我想知道,为什么调试和发布模式之间存在差异?

编辑:对不起,它必须是char而不是char *。但同样的错误。

3 个答案:

答案 0 :(得分:2)

strtoul对char不起作用,仅对空终止字符串起作用。您将不得不使用空终止字符串,或找到另一种方式。 E.g。

char input = 'K';
...
char temp[2] = { input, '\0' };
long output = strtol(temp, NULL, 36);

答案 1 :(得分:2)

由于&input未指向以null结尾的字符数组,因此代码具有未定义的行为。

这应该有效:

const char* input = "K";
long output = strtol(input , NULL, 36);

出现在调试版本中工作的原因可能是编译器在input变量周围插入了“魔术”值,以便能够检测到堆栈损坏,并且零恰好放在&input + 1

答案 2 :(得分:1)

你的电话错了,你不应该拿指针的地址!

应该是:

strtoul(input, NULL, 36);