2015-12-05 11 views
0

我在因特網上搜索瞭解決方案,發現了一些結果,但仍然出現錯誤。 我的C程序中有一個局部變量n和全局變量undefined。 和錯誤或錯誤我:「無法訪問地址0x600b0c處的內存」和「當前上下文中沒有符號」n「。在使用gdb編譯時出現全局和局部變量

print f("Enter value m & n : "); 
    (gdb) set variable n = 2 
    No symbol "n" in current context. 
    (gdb) set variable m = 2 
    Cannot access memory at address 0x600b0c 
+0

很難告訴你發佈你的代碼。 –

+0

我嘗試發佈它,但我無法做到這一點。我的代碼中沒有任何內容。我有兩個變量m全局變量和一個局部變量未初始化,併爲n&m寫入兩個scanf語句。而已。下面你可以看到我的代碼@ S.IQUEBAL –

+0

在你的代碼中沒有問題,並且gdb在我的系統中沒有給出錯誤信息。@P Krishnama Naidu –

回答

1

這會更容易知道您是否會發布一些代碼,但是讓我們假設它看起來是這樣的:

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?)併發布你的一些代碼。

+0

我正在使用Kali Linux @ Rupert Swarbrick #include int m; 函數() { \t printf(「\ nWelcome to function \ n」); } int main() { \t int n; \t printf(「Enter value m&n:」); \t的scanf( 「%d」,&m); \t的scanf( 「%d」,&n); \t的printf( 「局部變量 'N' 值:%d」,N); \t \t的printf(「\ nGlobal變量「米'值:%d」,男); \t的printf( 「\ nCalling功能...」); \t功能(); \t返回0;} 我 –

+0

剛剛試過你塞進代碼評論,使用GCC 5.2.1和GDB 7.10編譯爲「-g3 -O0」。一切都按我期望的方式工作:我可以設置和讀取m,n的值,只需要很好。與什麼的成績單你已經嘗試過,看到了什麼。 –