Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ strtol在调试和发布模式上有所不同_C++_Visual Studio 2008 - Fatal编程技术网

C++ strtol在调试和发布模式上有所不同

C++ strtol在调试和发布模式上有所不同,c++,visual-studio-2008,C++,Visual Studio 2008,我使用Visual Studio 2008:C++编译的以下代码: char input = 'K'; long output= strtol(&input , NULL, 36); 在调试模式下工作正常,输出为20。 但在释放模式下,它会产生奇怪的输出,如604663109。 当我设置“禁用代码优化”时,它也可以工作,但这不是解决方案。 我也知道,如何手工计算,但我想知道,为什么调试模式和发布模式之间存在差异 已编辑:抱歉,它必须是char而不是char*。但同样的错误。strtou

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

char input = 'K';
long output= strtol(&input , NULL, 36);
在调试模式下工作正常,输出为20。
但在释放模式下,它会产生奇怪的输出,如604663109。
当我设置“禁用代码优化”时,它也可以工作,但这不是解决方案。
我也知道,如何手工计算,但我想知道,为什么调试模式和发布模式之间存在差异


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

strtoul对char不起作用,只对以null结尾的字符串起作用。您必须使用以null结尾的字符串,或者找到其他方法。例如

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

您的呼叫是错误的,您不应该使用指针的地址

应该是:

strtoul(input, NULL, 36);

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

这应该起作用:

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

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

处恰好放置了一个零,删除操作符的地址是否会产生差异?我还建议将输入声明为const char*对不起,它必须是char而不是char*。但同样的错误。对于GCC,您的原始代码是:“警告:不推荐将字符串常量转换为‘char*’”和“错误:无法将参数‘1’的‘char**’转换为‘const char*’到‘long int strtol(const char*,char**,int)’”。编辑后的新代码:“错误:从'const char*'到'char'的转换无效。”。你能发布真实的代码吗?谢谢。哇,现在它工作了。非常感谢。但为什么它在调试模式下工作呢?因为您没有以null结尾的字符串。这是一个未定义行为(undefined Behavior,UB)的例子,使用UB的程序看起来很正常,即使它们确实存在bug。它是使C++变得硬的东西之一。@ SpZiffIy最有可能的是调试器在你的字符之后将内存中的字节归零,在发布中它们有一些不同的值(无论以前有什么)。但正如约翰所说,这是未定义的行为。谢谢,很高兴知道。但是无法更改“输入”的类型,因此john的解决方案是更好的:-)