2010-04-12 29 views
1
while(1){ 
    //Command prompt 
    char *command; 
    printf("%s>",current_working_directory); 
    scanf("%s",command);<--seg faults after input has been received. 
    printf("\ncommand:%s\n",command); 
} 

我收到了幾個不同的錯誤,他們似乎並不真正可重現(除了在這一點上的段錯誤)。這段代碼在大約10分鐘前運行良好,然後它無限循環printf命令,現在它在上面提到的行上發生了seg錯誤。我改變的唯一的東西是scanf(">%s",command);到目前爲止。如果我將命令變量更改爲數組,它將起作用;顯然這是因爲存儲空間已經被預留了。scanf段錯誤和各種其他異常內循環

  1. 我被起訴約告訴別人,他們需要的malloc一個指針*(但通常似乎解決的問題,如使之成爲一個數組)
  2. 我輸入的命令是「魔法」 - 5個字符 - 所以不應該有任何瘋狂的堆棧溢出。
  3. 我與最新版本的Xcode(非OS4)和標準GCC在Mac OS X 10.6上運行
  4. 這是我的編譯程序:gcc --std=c99 -W sfs.c

只是想弄清楚到底是怎麼回事上。由於這是一個學校項目,我永遠不會再看到,我只是編寫一些noob的工作,這將使我的老闆哭泣:)但事後我很想弄清楚爲什麼這是發生的,而不是隻是做一些修復它,如果有一些修復它爲什麼修復工程。

回答

11

scanf嘗試將其讀入參數的數據(您的案例中的command)存儲。該變量尚未初始化爲指向有效內存。因此,爲其分配內存的malloc將使其有效。它也可以在棧上宣佈:

char command[somearraysize]; 
+0

是的,我認爲通過使用char *命令,輸入將被放置在堆棧上。我經常遇到這個問題,最終會使用malloc和免費的濫用程序來保持我的程序不會發生seg錯誤。我在3周內畢業,並且我不需要爲愚蠢的seg-faults錯誤點:) – Kaili 2010-04-12 22:26:22

+4

這些都是C中非常基本的概念,當你將'command'傳遞給scanf函數時,scanf不能將該指針指向某處,也不C可以奇蹟般地在堆棧上分配空間並在那裏指向指針。您需要提供存儲。 – leeeroy 2010-04-12 22:34:50

+0

@Shadow:名爲command的變量(通常)位於堆棧上。但它是一個具有潛在「隨機」值的指針,直到初始化爲止。 scanf會嘗試將數據寫入該「隨機」地址。 – 2010-04-12 22:43:57

11
char command[100]; 
scanf("%s",command); 

至於爲什麼這是必要的,我建議你讀一本書上C,如The C Programming Language

+0

我明白創建一個緩衝區。我在工業界工作,我是一名畢業生,但是謝謝你的提示。> – Kaili 2010-04-12 22:27:48

+21

〜影不,你不明白。 – 2010-04-12 22:28:45

+1

非常感謝。除了將我引用到我已經使用過的參考資料之外,甚至不會去嘗試和提供幫助。我知道這是如何工作的,我想知道爲什麼我的沒有。如果通過使用char *命令將事物放置在堆棧上,爲什麼會發生seg錯誤,而不是在內存中行走,而不應該這樣做。但這不應該發生,因爲該程序有它自己的堆棧。 – Kaili 2010-04-12 22:33:26