2013-10-03 67 views
2

我剛開始開始用C語言編寫代碼,並且在賦值時遇到很多困難。我假設使用malloc和free來創建一個使用結構的記錄數據庫。這些結構將充當我的數據庫。我需要能夠添加和刪除記錄。我也不能使用陣列爲我的結構,但可以在代碼中的任何其他地方使用數組。老師給了我一個關於如何佈置代碼的想法,但我不知道如何保存我的輸入以將其添加到記錄中。任何幫助?Segfault當我嘗試將變量添加到結構中時

我有很多我的代碼註釋出來排除故障。還有主要底部的兩個printf語句用於故障排除。我可以把它打印出來的名字,但一旦我添加姓,我得到一個seg錯誤。我相信我沒有爲此發生內存分配,但還沒有完全理解這些東西。請幫助!謝謝!!!!

回答

0

因爲你正在閱讀的數據爲未初始化的指針:

printf ("Please enter your first name:\n"); 
    gets(library.fName); 
    printf ("Please enter your last name:\n"); 
    gets(library.lName); 

使用malloc分配內存並使用它們,free()他們一旦你完成。如果你不需要指針,你可以在你的struct中使用陣列

  1. 請不要gets(),因爲它無法防止緩衝區溢出。改爲使用fgets()

  2. int main()應該是int main(void)int main(int argc, char *argv[])或其等價物。

0

沒有您的結構成員分配給它們的內存。爲了方便,首先將它們定義爲

char fName[10]; 
char lName[10]; 
etc, 

一旦你熟悉這個,然後嘗試內存分配。 (IOW,一次一個概念)

0

您遇到的問題是您實際上沒有分配任何內存來存儲輸入。讓我們從你的結構開始吧:

struct record{ 
    char * fName; 
    char * lName; 
    };   

在內存中這個結構只是兩個char指針。結構本身是8個字節長。指針沒有初始化爲任何東西,所以它們具有隨機值。當你將它們用作指針時,你會指向內存中的一個隨機位置。

如果你想實際上是第一個和最後一個名字保存在你的結構,那麼你可以創建這樣的結構:

static const int MaxNameLength = 255; 
    struct record{ 
    char fName[MaxNameLength + 1]; 
    char lName[MaxNameLength + 1]; 
    };   

或者您可以使用結構,你寫的方式,但分配內存的緩衝區和更新指針。如果你這樣做,你需要做的是:

static const int MaxNameLength = 255; 
struct Record library; 
library.fName = (char *)malloc(MaxNameLength + 1); 
library.lName = (char *)malloc(MaxNameLength + 1); 

這兩種方法都是有效的,但優勢第一種方法是,你會不會需要自己清理內存。當結構超出範圍時,所有內存都被釋放。如果你自己記憶,那麼你也需要釋放它。

0
struct record{ 
    char * fName; 
    char * lName; 
    //char * sAddress; 
    //char * city; 
    //char * state; 
    //int * zip; 
    }; 

在你的結構你正在使用的char * FNAME

,但你的輸入法是不正確的,你必須爲

但在C

一個新手

保持FNAME做的malloc和lname作爲字符數組像

struct record{ 
     char fName[100]; 
     char lName[100]; 
     //char * sAddress; 
     //char * city; 
     //char * state; 
     //int * zip; 
     }; 

現在你的上面的代碼工作正常..

1

問題在於式「結構記錄」初始化「庫」變量或實際上它的不足:

struct record library; //this will hold info for user input 

FNAME和LNAME成員未初始化的指針爲char。爲緩衝區分配內存並初始化那些指向這些緩衝區的指針。未初始化的指針只是指向「某些」內存位置。當您將數據放入該位置時,可能會發生任何事情!或者,提供固定大小的緩衝區來代替這些指針,例如:

struct record { 
    char fName[100]; 
    char lName[100]; 
}; 

這應該是第一步。接下來是使用malloc/free作爲你的任務說。將結構記錄恢復爲原始格式,並使用malloc爲緩衝區保留內存,然後將它們傳遞給任何函數或以其他方式使用它們;像這樣

#define BUFSIZE (100) 
library.fName = malloc(BUFSIZE); 
library.lName = malloc(BUFSIZE); 

內存預留後,您可以使用它們。但不通過比字符這些緩衝區的BUFSIZE數量。

與緩衝區釋放分配的內存後,你做:

free(library.fName); 
free(library.lName); 

釋放你可能不再使用它們的緩衝區後。 也不要使用gets()。它沒有爲緩衝區溢出提供任何保護,因爲最大緩衝區大小不作爲gets()的參數傳遞。它已被棄用,並將從即將到來的標準C1X中移除爲不安全的。

0

fName和lName是指針,通常你必須爲每個指針分配內存給每個指針和空閒內存。如果您讀取或寫入的指針是未分配的內存分段錯誤將發生, 您可以創建一個名稱爲[20]的數組並使用gets函數。將內存分配給lName和fName,如malloc(strlen(name))。稍後免費結束。嘗試在主函數中使用malloc和free,因爲它可能會產生問題(稍後您將學習通過值傳遞並通過引用問題傳遞)

相關問題