2017-07-03 15 views
-1

私はCプログラミングの初心者で、ここではかなり簡単なコードを持っています。 コンパイルされますが実行されず、セグメンテーションフォルトが表示されます。私は間違っているかもしれない何時間も探していた。今私は、セグメンテーションフォールトが何を意味するのか、それはなぜ私の小さなコードに表示されるのか、かなり良いアイデアを持っています: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'はnull以外のポインタを返しますか? –

答えて

1

あなたは前pointer != NULLチェックstrにそれを割り当てる必要があります。 getpwnam()は、エントリが見つからなかった場合、またはエラーが発生した場合にNULLを返します。詳細については、https://linux.die.net/man/3/getpwnamを参照してください。

+2

これは答えよりもむしろコメントです。 –

0

私はここにいくつかの問題を検出することができます:引数の数が、そうでない場合は​​からの戻り値がnull以外の値を返す場合は、チェックすべきプログラム

  • を終了し、0より大きい場合

    • チェックを。

    私はこれを書き換えます:あなたはおそらくこれが欲しい

    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フォルト)が発生します。

    ところで、変数struct passwd strは不要です。pointerに直接アクセスできます。