2012-03-13 18 views
1

構造体配列を拡張する適切な方法でしょうか?構造体配列を拡張する

typedef struct { int x,y,z;} student_record; 

int main(){ 

student_record data_record[30];  // create array of 30 student_records 
num_of_new_records = 5; 

data_record = realloc(data_record,(sizeof(data_record) + (sizeof(student_record)*num_of_new_records))); 

// do I now have an array of 35 student_records??? 

答えて

4

いいえ - 配列に割り当てることはできません。あなたのコードはコンパイルされません - あなたはそれを試しましたか?

あなたがしたい場合はrealloc()あなたはmalloc()(またはその親族の1)を使用しておく必要があります。

student_record *data_record = malloc(sizeof(student_record) * 30); 

あなたはおそらくどちらか、元の変数にrealloc()バックの戻り値を割り当てるべきではありません。なんらかの理由で失敗すると、元のポインタが失われ、そのメモリがリークします。

+0

どのような方法を使用しますか?大きなサイズの新しいテンポラリ配列を作成してコピーし、malloc()を最初のサイズに戻してコピーをやり直しますか? –

+0

'realloc()'を使いたい場合は配列を使わないでください。ポインタと 'malloc()'を使ってください。 –

1

初期サイズをcalloc'ingし、必要に応じてreallocを使用するパターンに従ってください。 realloc'ingの安全な練習には、一時変数に返された初期値を代入し、エラーがないことを確認した後に最初の変数を上書きする必要があります。

student_record *data_record = malloc(sizeof(student_record) * 30); 
student_record *tmp; 

// need larger size 
if ((tmp = realloc(data_record, new_size)) == NULL) 
    perror(); //possibly exit as well since you're out of memory 
else 
    data_record = tmp; 
1

ヒープ(動的に割り当てられている)にあるオブジェクトに対してのみreallocを使用できます。したがって、最初にmallocする必要があります。

typedef struct { int x,y,z;} student_record; 

int main() 
{ 
    student_record *data_record = malloc(sizeof(student_record)*30); 
    assert(data_rocord); 
    data_record = realloc(data_record, sizeof(student_record)*35); 
    assert(data_record); 
    free(data_record); 
    exit(EXIT_SUCCESS); 

}