[英]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.