[英]strtol differs in debug and release mode
我在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);
由于&input
并不指向以null结尾的字符数组,因此代码具有未定义的行为。
这应该工作:
const char* input = "K";
long output = strtol(input , NULL, 36);
它似乎在调试版本中起作用的原因可能是编译器已在input
变量周围插入了“魔术”值,以便能够检测堆栈损坏,并且在&input + 1
处放置了零。
您的通话错误,您不应该使用指针的地址!
它应该是:
strtoul(input, NULL, 36);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.