-1

我在使用 Visual Studio 2008 编译的 C++ 中使用以下代码:

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

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

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

4

3 回答 3

2

strtoul 不适用于 char,仅适用于以空字符结尾的字符串。您必须使用以空字符结尾的字符串,或者找到另一种方法。例如

char input = 'K';
...
char temp[2] = { input, '\0' };
long output = strtol(temp, NULL, 36);
于 2013-11-08T10:24:35.763 回答
2

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

这应该有效:

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

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

于 2013-11-08T10:37:48.793 回答
1

你的调用是错误的,你不应该拿指针的地址!

它应该是:

strtoul(input, NULL, 36);
于 2013-11-08T10:24:35.987 回答