2016-01-28 4 views
0

У меня возникли проблемы с выяснением того, как выделить выделенную массивную массивную массив.C Куча, выделяющая массив жестко закодированных структур

Imagine У меня есть структуры:

struct my_struct 
{ 
    ... 
}; 

struct holder 
{ 
    my_struct *array_of_struct; 
    ... 
}; 

Теперь для создания экземпляра struct holder хотя, массив struct my_struct должен быть жестко закодированы, такие как:

struct holder *new_holder() 
{ 
    struct holder *my_holder = malloc(sizeof(struct holder)); 
    if (my_holder == NULL) 
     exit(-1); 

    struct my_struct arr[] = {mystruct_instace_1, mystruct_instance_2, ...}; 
    holder->array_of_struct = arr; 
    return holder; 
} 

Это назначение, хотя не работает, потому что он указывает на arr, который выделен стекми. Как я могу сделать это назначение holder->array_of_struct кучей выделенных?

+1

В качестве очень незначительной точки: я бы назвал функцию 'new_holder()' или 'holder_new()'. Как правило, «init» часто означает «инициализировать эту структуру, которую я выделил» и «новый», часто означает «выделять и инициализировать». –

ответ

2

супер-ленивый способ сделать это просто скопировать массив в буфер из malloc() следующим образом:

struct my_struct arr[] = {mystruct_instace_1, mystruct_instance_2, ...}; 
holder->array_of_struct = malloc(sizeof(arr)); 
assert(holder->array_of_struct); 
memcpy(holder->array_of_struct, arr, sizeof(arr)); 
return holder; 

К «супер-ленивым» Я имею в виду «минимальное количество строк кода, написанных» ,

+0

Теоретически компилятор должен оптимизировать «arr» здесь, но я бы не задерживал дыхание. –

+1

Примечание: 'assert' - это просто ленивый способ обработки отказов. – immibis