簡體   English   中英

如何修復C語言在Linux上的segmentation fault錯誤?

[英]How can I fix the segmentation fault error in C language on Linux?

在我的 C 程序中,我試圖更改包含/etc/passwd記錄的密碼文件的 gecos 字段。 首先,用戶輸入賬戶名,程序找到輸入賬戶名的gecos字段,如果gecos字段的大小大於0,程序要求用戶輸入新的gecos字段。 然后,如果新的 gecos 字段和舊的 gecos 字段的大小相等,它應該更新它,但我想我有一個問題gec=malloc(strlen(pw->pw_gecos)+1); 部分是因為我收到分段錯誤錯誤。 我該如何解決這個問題? 先感謝您。

我的代碼如下:

struct passwd *pw;
struct passwd *pwd;
char *gec;

printf("Enter the account name: "); 
scanf("%s", &sItem); 

if ((pw = getpwnam(sItem)) == NULL) {
    printf("getpwnam: unknown %s\n",
           "passwd.idx" );
    exit(0);
}

if ((pw->pw_gecos = malloc(strlen(pw->pw_gecos)) + 1) == NULL) {
    puts("error");
    return 3;
}
int sz = strlen(pw->pw_gecos);

printf("Account name: %s\n", sItem);
printf("Size of the entered GECOS field: %d\n", sz);

if (sz > 0) {
    printf("Update the gecos field: "); 
    scanf("%s", &gec);
    if (strlen(gec) == sz) {
        //pw->pw_gecos = pwd->pw_gecos;
        gec = malloc(strlen(pw->pw_gecos) + 1);
        //gec = pwd->pw_gecos;

        printf("Gecos field is updated successfully!");
        printf("Updated GECOS field: %s\n", pwd->pw_gecos);
        //gec = pw->pw_gecos;
    }
}

pw->pw_gecos = malloc(strlen(pw->pw_gecos)) + 1)用指向未初始化數據的指針覆蓋由getpwnam()設置的指針。

當您嘗試讀取字符串pw->pw_gecos時,代碼的 rest 具有未定義的行為。

目前尚不清楚您要實現的目標,因為您只發布了一個缺少上下文和定義的代碼片段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM