2017-07-03 297 views
-1

我在C編程新手,這裏有非常簡單的代碼。 它編譯但不會運行,並出現分段錯誤。我正在尋找幾個小時,可能是錯誤的。現在我有一個不錯的主意段錯誤是什麼意思,但不是爲什麼它在我的一小段代碼顯示出來:分段故障

它應該打印出給定參數的USER_ID和GROUP_ID。

#include <unistd.h> 
#include <sys/types.h> 
#include <stdio.h> 
#include <pwd.h> 

int main(int argc, char *argv[]){ 

    if(argc != 1){ 
     printf("ERROR"); 
    } 

    struct passwd str; 

    struct passwd *pointer = getpwnam(argv[1]); 

    str = *pointer; 

    printf("user: %d /ngroup: %d",str.pw_uid, str.pw_gid); 

    return 0; 
} 
+1

如果你想訪問'的argv [1]','argc'必須是'> 1',不'!= 1'。你也應該在'if'中退出你的程序。 – mch

+0

如果存在錯誤,您不應該嘗試阻止程序繼續執行嗎? – babon

+0

'getpwnam'是否返回一個非空指針? –

回答

1

在分配到str之前,您應該檢查pointer != NULL。 getpwnam()在沒有找到條目或發生錯誤的情況下返回NULL。有關更多詳細信息,請參見https://linux.die.net/man/3/getpwnam

+2

這不是一個答案而是一個評論。 –

0

我可以在這裏發現了一些問題:

  • 檢查參數的數目大於0,否則退出程序
  • 您應該​​返回非NULL值檢查返回值。

我想改寫這個來:

int main(int argc, char *argv[]){ 
    struct passwd str; 
    struct passwd *pointer; 

    //Number of arguments check 
    if (argc <= 1) { 
     printf("ERROR"); 
     exit(0); 
    } 

    pointer = getpwnam(argv[1]); 
    if (pointer) { 
     str = *pointer; 
     printf("user: %d /ngroup: %d\r\n",str.pw_uid, str.pw_gid); 
     printf("user: %d /ngroup: %d\r\n", pointer->pw_uid, pointer->pw_gid); 
    } 

    return 0; 
} 
0

你可能想這樣的:

#include <unistd.h> 
#include <sys/types.h> 
#include <stdio.h> 
#include <pwd.h> 

int main(int argc, char *argv[]){ 

    if(argc < 2){ 
     printf("usage: %s username", argv[0]); 
     return 1; 
    } 

    struct passwd *pointer = getpwnam(argv[1]); 

    if (pointer == NULL) { 
     printf("user: %s does not exist\n", argv[1]); 
     return 1; 
    }  

    printf("uid: %d\ngroup: %d\n", pointer->pw_uid, pointer->pw_gid); 
    return 0; 
} 

您需要檢查是否​​回報NULL。如果是的話,那意味着用戶不存在並且取消引用NULL指針導致未定義的行爲(通常是seg故障)。

BTW:不需要變量struct passwd str,您可以直接訪問pointer