Расширение массива структуры - PullRequest
1 голос
/ 14 марта 2012

Будет ли это правильным способом расширения массива структуры?

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???

Ответы [ 3 ]

4 голосов
/ 14 марта 2012

Нет - вы не можете назначить массив.Ваш код даже не скомпилируется - вы пробовали?

Если вы хотите realloc(), вам нужно было использовать malloc() (или одного из его родственников):

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

Вы, вероятно, не должны присваивать возвращаемое значение realloc() обратно исходной переменной.Если по какой-то причине произойдет сбой, вы потеряете оригинальный указатель и потеряете эту память.

1 голос
/ 14 марта 2012

Вы можете использовать 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);

}
1 голос
/ 14 марта 2012

Вы должны следовать шаблону calloc'ing исходного размера и затем использовать realloc, когда это необходимо. Безопасная практика для перераспределения должна включать присвоение начального значения, возвращаемого во временную переменную, и перезапись первого после проверки, что ошибок нет. Примерно так:

 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;
...