C中的分段错误(初学者)

时间:2017-07-03 11:06:23

标签: c segmentation-fault

我是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;
}

3 个答案:

答案 0 :(得分:1)

在将pointer != NULL分配到str之前,您应先检查$('body').on('click', '.accordion-text', function() { return false; }); $('body').on('click', '.accordion-wrap', function() { $(this).children().eq(1).slideToggle(300); $(this).children().eq(0).toggleClass("accordion-no-bar"); $(this).siblings().find(".accordion-header").removeClass("accordion-gold"); $(this).siblings().find(".accordion-header i").removeClass("rotate-fa"); $(this).find(".accordion-header").toggleClass("accordion-gold"); $(this).find(".fa").toggleClass("rotate-fa"); $(".accordion-wrap .accordion-text").not($(this).children().eq(1)).slideUp(300); });。 如果未找到任何条目或发生错误,getpwnam()将返回NULL。有关详细信息,请参阅https://linux.die.net/man/3/getpwnam

答案 1 :(得分:0)

我可以在这里发现一些问题:

  • 检查参数数量是否大于0,否则退出程序
  • 您应该检查getpwnam的返回值是否返回NON-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;
}

答案 2 :(得分: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;
}

您需要检查getpwnam是否返回NULL。如果是,则表示用户不存在,并且取消引用NULL指针会导致未定义的行为(通常是seg错误)。

BTW:不需要变量struct passwd str,您可以直接访问pointer