簡體   English   中英

strtol在調試和發布模式上有所不同

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM