2015-12-01 3 views
-1

Я только учусь C и у меня есть этот код, который определяет две структуры в C:Указатель на массив структур - объяснение

typedef struct { 
    int id; 
    char *name; 
} Object; 

typedef struct { 
    unsigned size; 
    Object *items; 
} Array; 

Я не уверен, что там происходит, и как я могу работать с эти структуры.
Это правда, что структура Array содержит массив структур Object? Если да, то как? Здесь я не вижу никаких квадратных скобок.
Может кто-нибудь объяснить, что происходит внутри? Не уверен в указателях. Как я могу, например, инициализировать структуру Array, которая будет содержать количество структур Object в зависимости от размера?
Должен ли я использовать malloc или realloc? Если я использую функцию alloc в функции, как я могу ее освободить позже, если не знаю, сколько раз я вызывал эту функцию, содержащую malloc?

Благодаря

ответ

0

Array содержит указатель к Object, который может быть использован, чтобы указать на динамически выделяется массив, например, так:

Array arr; 
arr.size = 10; 
arr.items = malloc(sizeof *arr.items * arr.size); 

Каждый arr.items[i] имеет тип Object, так что вы можете установить id и name члены, как так:

arr.items[i].id = 1; 
arr.items[i].name = malloc(strlen("foo") + 1); 
if (arr.items[i].name) 
    strcpy(arr.items[i].name, "foo"); 

Когда вы закончите, вы должны убедиться, что вы бесплатно каждый arr.items[i].name перед освобождением arr.items:

for (size_t i = 0; i < arr.size; i++) 
{ 
    free(arr.items[i].name); // assumes memory for arr.items[i].name was 
}       // allocated with malloc, calloc, or realloc 
free(arr.items); 

Если arr.items[i].name установлен, чтобы указать на Строковый литерал или auto массив, такие как

arr.items[i].name = "foo"; 
... 
char some_array[] = "bar"; 
arr.items[j].name = some_array; 

, то вы бы не хотите позвонить по телефону free на эти вопросы.

1

«Верно ли, что структура массива содержит массив структур Object?» Нет, это не так. Структура Array содержит указатель, а не массив. Чтобы создать arry, вам необходимо выделить память malloc или calloc, а затем назначить ее этому указателю.

«Если я использую функцию alloc в качестве функции, как ее освободить позже, если я не знаю, сколько раз я вызывал эту функцию, содержащую malloc?» free(void* ptr) Очистить выделение, указанную malloc или calloc. Посмотрите здесь, например - http://www.cplusplus.com/reference/cstdlib/free/

Если вы хотите, чтобы иметь массив внутри вы должны иметь что-то вроде этого

typedef struct { 
    unsigned size; 
    Object items[10]; 
} Array; 
Смежные вопросы