我在使用visual studio 2008进行c ++编译时使用以下代码:
char input = 'K';
long output= strtol(&input , NULL, 36);
在调试模式下工作正常,输出为20 但在发布模式下,它会产生奇怪的输出,如604663109 当我设置禁用代码优化时,它也可以工作,但这不是解决方案 我也知道,如何手工计算,但我想知道,为什么调试和发布模式之间存在差异?
编辑:对不起,它必须是char而不是char *。但同样的错误。
答案 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);