這會更容易知道您是否會發布一些代碼,但是讓我們假設它看起來是這樣的:
int m;
int read_nums (void)
{
printf ("Enter value of m and n: ");
int n = scanf ("%d");
m = scanf ("%d");
return n + m;
}
你的GDB實例坐在第一行,所以n
目前不在範圍內。隨着優化編譯器,如果你的代碼看起來像這一點,仍然是正確的:
int m;
int read_nums (void)
{
int n;
printf ("Enter value of m and n: ");
n = scanf ("%d");
m = scanf ("%d");
return n + m;
}
編譯器轉換程序在編譯過程中很早就儘量減少變量的作用域。
如果您嘗試使用GDB設置n的值,則可能該變量在scanf
行後生效。在這種情況下,使用GDB的next
命令來執行步驟,直到它被設置,然後使用set
命令(或類似p n = 2
)更改它。
對於代碼是我寫的那麼簡單,編譯器將完全的Elid n
,它會更喜歡這樣的東西產生:
int m;
int read_nums (void)
{
printf ("Enter value of m and n: ");
return scanf ("%d") + (m = scanf ("%d"));
}
其中n
永遠存在。要在事後設置該值,您必須允許生成基於n
的任何值,然後進行相應設置。
如果你可以很容易地重新編譯代碼,你可能會考慮與-O0 -g3
編譯它(GCC標誌,但合理的標準)來禁用所有優化,而你閒逛使用調試器:它往往容易得多與C匹配代碼然後。除了編譯器中的錯誤之外,您可以使用這些標誌來處理所有事情,然後在最後重新開啓優化。
恐怕我不知道你看到的m
錯誤是怎麼回事。地址看起來相當令人驚訝:也許你需要告訴我們更多關於你的環境(linux?embedded?)併發布你的一些代碼。
很難告訴你發佈你的代碼。 –
我嘗試發佈它,但我無法做到這一點。我的代碼中沒有任何內容。我有兩個變量m全局變量和一個局部變量未初始化,併爲n&m寫入兩個scanf語句。而已。下面你可以看到我的代碼@ S.IQUEBAL –
在你的代碼中沒有問題,並且gdb在我的系統中沒有給出錯誤信息。@P Krishnama Naidu –