我是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;
}
答案 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)
我可以在这里发现一些问题:
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
。