2016-10-13 7 views
0

構造体のエントリを削除し、reallocを使用してメモリを解放しようとしています。私の構造は構造体のエントリを削除し、メモリを解放するためにreallocを使用する方法

typedef struct person { 
    char fname[20]; 
    char lname[20]; 
    int number[10]; 
}person; 

Imが入力されたエントリ

void delInfo(int*,person*); 

削除機能が動作するようになっている方法を削除する機能を使用している、その後、その後戻ってすべてのレコードをシフトする、と述べたエントリを検索する最後の解放でありますreallocと記録します。 はそれのためのコードは、これまでこれまでのところ、私は最初と最後の名前の一致を検索し、私はすべてのエントリを移動する場合、何が起こるかを知らないことができ、この

void delInfo(int *num_entries,person*contacts){ 
    char delfirst[20]; 
    char dellast[20]; 

    printf("\n First Name: "); 
    scanf("%s",delfirst); 
    printf(" Last Name: "); 
    scanf("%s",dellast); 
    int i=0; 

    for (i=0; i<*num_entries;i++){ 
     if (delfirst==contacts[i].fname && dellast==contacts[i].lname){ 

     } 
    } 
} 

のように見える「ダウン1。」一致するエントリは、連絡先[i]は

int c; 
for (c=i+1;c<*num_entries;c++){ 
    contacts[i].fname=contacts[c].fname; 
    contacts[i].lname=contacts[c].lname; 
    contacts[i].number=contacts[c].number; 
} 
contacts=(person*)realloc(contacts,sizeof(contacts)*(num_entries-1)); 

のようなものを私は削除する予定の1 AFTERすべてのエントリに、彼らはちょうど私が削除したい項目を「上書き」ないことを行う場合、私はreallocためにできることであれば構造体配列を短くして基本的にメモリを解放しますか?

答えて

0

iは、削除したいエントリのインデックスである場合は、あなたが本当にする必要があるすべては次のとおりです。

for (c = i; c < *num_entries - 1; c++) 
    contacts[c] = contacts[c+1]; 

次にあなたが小さい動的配列のために再割り当てすることができます。構造体は互換性のある構造体に割り当てることができるため、構造体の各フィールドを個別に割り当てる必要はありません。

関連する問題