2014-01-25 3 views
0

Как правильно получить доступ к цен члена из категории структуры?структуры с другой структурой в нее

Это код:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define SMAX 128 

typedef struct { 
    int price; 
    char favCharacter[SMAX], edition[SMAX]; 
} category; 

typedef struct { 
    char title[SMAX], fname[SMAX], lname[SMAX]; 
    category *cat; 
} book; 

int main(int argc, char **argv) { 

    book *data = malloc(100 * sizeof(book)); 
    (data->cat)->price = 10; //1 
    printf("\n\n(*(data->cat)).price is: %d%s", (data->cat)->price, "\n\n"); 

    return 0; 

} 

Моя первая попытка оказалась неудачной (// 1) Что такое правильный способ решить эту проблему? (Я имею в виду структуру с другой структурой).

ответ

1

Вы размещаете память для book, но не для cat s внутри книг. Вот пример:

/* allocate a hundred books */ 
book *data = malloc(100 * sizeof *data); 
/* allocate one cat per book */ 
for (i = 0; i < 100; ++i) 
    data[i].cat = malloc(sizeof *data[i].cat); 

/* now you can use it */ 
for (i = 0; i < 100; ++i) 
    data[i].cat->price = 50; 

Примечание: вам нужно добавить проверку, чтобы убедиться, что malloc не терпит неудачу, прежде чем продолжить, используя возвращенную память. Кроме того, лучше избегать магических чисел, таких как 100 выше. Кроме того, не забудьте оставить free память позже.

+0

Только один вопрос: если я объявляю переменную книги следующим образом: ** данные книги; **, мне нужно будет выделить память для курсора ** cat **? –

+0

Да. 'cat' - это указатель, который указывает на ... ну ... пока вы не присвоите ему что-то, где-то полностью случайное. Поэтому, независимо от того, как вы получаете свою 'книгу' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' – Shahbaz

0

Изменить

book *data = malloc(100 * sizeof(book)); 
(data->cat)->price = 10; //1 
printf("\n\n(*(data->cat)).price is: %d%s", (data->cat)->price, "\n\n"); 

в

// 1. need explicit conversion 
book *data = (book *) malloc(100 * sizeof(book)); 

// 2. allocate category for book *data 
for (int i=0; i<100; i++) 
    data[i].cat = (category *) malloc(sizeof(category)); 

// 3. setting 
(data[0].cat)->price = 10; 

// 4. read 
printf("\n\n(*(data->cat)).price is: %d%s", (data[0].cat)->price, "\n\n"); 
1

Вы выделяете массив книг в вашей линии:

book *data = malloc(100 * sizeof(book)); 

Таким образом, вы должны получить доступ к элементу массива, прежде чем получить доступ к его содержимому:

data[0].cat->price = 10; // lets access element 0 for example. 

Но, во-первых, вы должны также Alloc данные для cat переменной внутри каждого элемента массива:

for (int i = 0; i < 100; i++) { 
    data[i].cat = malloc(sizeof(category)); 
} 

Теперь вы можете получить доступ к элементам правильно.

Не забудьте освободить выделенную память.

Смежные вопросы