2013-04-12 5 views
3

У меня есть структура, называемая складом, и общий связанный список, и каждый элемент указывает на структуру хранилища.Распределение памяти для функционального указателя

typedef struct linked{ 
    char type; 
    void * item; 
    struct linked * next; 
    struct linked * prev; 
}LinkedList; 


typedef struct warehouse{ 
    char * name; 
    float volume; 
    float (* getPrice) (void * S); 
    float (* getTotalDollarAmount)(void * S); 
}house_t; 

Когда я попытался получить getPrice функцию точки указатель на функцию float price (void *S)

void menu (LinkedList *house){ 
    char *c; 
    float num; 
    c = (char*)malloc(sizeof(char)*10); 

    LinkedList *i; 
    i = (LinkedList*)malloc(sizeof(LinkedList); 
    house_t *sk; 
    sk = (house_t *) malloc(sizeof(house_t)); 
    //i->item = (house_t *) malloc(sizeof(house_t)); 

    scanf("%c", c); 

    ((house_t*)i->item)->getPrice = price; 
    sk=findhouse(house, c); 
    num = ((house_t*)i->item)->getPrice(sk); 
    printf("%f",num); 
} 

меня плохая ошибка доступа. Поскольку каждый раз, когда я получал плохую ошибку доступа, это было потому, что я не выделял память для чего-то. Но мне нужно выделить память для указателя функции? Если да, то как?

Вот некоторый код

float price (void *S) 
{ 
    return ((house_t*)S)->volume; 
} 
+1

Это не выглядит, как вы выделили память для 'item' не так ли? Можете ли вы показать нам больше кода инициализации? – RageD

+1

Ваша ошибка кажется очевидной или вам нужно поместить другую информацию. –

+0

Я попытался выделить память для элемента с помощью 'i-> item = (house_t *) malloc (sizeof (house_t))', но получил плохой доступ для этой строки , – otchkcom

ответ

1
LinkedList *i; 
i = NewLinkedList(); 

/* ... snip ... */ 

LinkedList *NewLinkedList() 
{ 
    return NULL; 
} 

Согласно вашему определению NewLinkedList(), переменная i теперь NULL. Вы пытаетесь разыгрывать его с помощью i->item = ..., но вы не можете сделать этого, если i - NULL. Я думаю, что вы действительно хотите сделать, это выделить место для связанного списка в вашей NewLinkedList функции:

LinkedList * NewLinkedList() 
{ 
    LinkedList *result = malloc(sizeof(LinkedList)); 
    result->type = '\0'; // set to suitable initial value 
    result->item = NULL; 
    result->next = NULL; 
    result->prev = NULL; 
    return result; 
}