2016-02-10 50 views
1

我不斷收到分段錯誤時,在Ubuntu段錯誤在Ubuntu

gcc program.c 
./a.out $gjdvc1A 

具備下列參數在下面的代碼

# include <stdio.h> 
int lcount(char str[]) 
{ int i=0; 
    while(str[i]!='\0') 
    { 
     i++; 
    } 
    if (i<5||i>15) 
     printf("0"); 
    else 
     printf("1"); 
} 
main(int argc , char *argv[]) 

{ 


    lcount(argv[1]); 


} 

任何機構可以幫我告訴大家,這是爲什麼發生

+1

該程序該做什麼?不要試圖欺騙我們,因爲我不認爲這是實際的代碼。它不編譯,它在函數調用中沒有分號。你只是手寫代碼。複製粘貼代碼。 –

回答

1

您正在傳遞環境變量$ gjdvc1A的值作爲參數。而且你的程序沒有任何參數檢查,當環境變量的值沒有設置時,它總是會崩潰

0

首先你必須做一些修復來編譯程序。

# include <stdio.h> 
int lcount(char str[]) { 
    int i=0; 
    while(str[i]!='\0') 
    { 
    i++; 
    } 
    if (i<5||i>15) 
    printf("0"); 
    else 
    printf("1"); 
} 

int main(int argc , char *argv[]) 
{ 
    lcount(argv[1]); 
} 

然後,問題不在你的代碼中(即使它應該大大改進!)。問題在於你用空參數調用它,因爲$gjdvc1A被shell評估爲空變量,並且由於在代碼中沒有任何安全檢查,它將導致分段錯誤。

解決方案

  • 裹程序參數在單引號,如果你不希望他們被shell
  • 進行評價總是在程序參數進行安全檢查呢!
0

那麼,我不知道這個問題很好,但我想我得到了答案。

基本上,argv[]是一個包含你的命令行參數的數組帽,argv[1]是第一個(當然除argv[0]之外的命令表示本身)。

那麼,在執行程序時,當您傳遞參數$gjdvc1A時,由於符號$,shell正在評估它爲空變量。

而且,你的程序有錯誤:

變化lcount(argv[1])lcount(argv[1]);

要傳遞的參數與前$,只是把它\逃脫字符。

你編寫的這個程序不好,你應該做錯誤檢查,當然還要對參數進行安全檢查。

爲了使該程序更好,請使用int main並在main的末尾輸入return 0

0

當你在bash中傳遞一個以$符號開頭的參數時,bash會將其視爲一個變量,並在將該變量傳遞給該程序之前嘗試獲取該變量的值。所以當你運行./a.out $gjdvc1A bash實際上會查找變量gjdvc1A,並且因爲沒有該名稱的變量,所以它沒有通過argv[1]。換句話說,這相當於無任何爭論地運行./a.out。因此,當您嘗試訪問lcount函數中的str[0]函數時,您試圖訪問垃圾地址,從而導致分段錯誤。

要解決此問題,您需要轉義$或在調用時使用引號告訴bash不要將其視爲變量。

./a.out \$gjdvc1A 

./a.out '$gjdvc1A' 

除了這個問題,還有其他問題太:

  • 您應該使用intmain返回類型,並在主要的最終調用return 0;
  • 在線lcount(argv[1])處有一個缺失分號。