4

倉庫と呼ばれる構造体と一般的なリンク リストがあり、各アイテムは倉庫構造体を指しています。

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;
}
4

1 に答える 1

1
LinkedList *i;
i = NewLinkedList();

/* ... snip ... */

LinkedList *NewLinkedList()
{
    return NULL;
}

の定義によるとNewLinkedList()、変数iは現在NULLです。で逆参照しようとしますが、 is の場合はi->item = ...できません。あなたが本当にやりたいことは、関数内のリンクリストにスペースを割り当てることだと思います:iNULLNewLinkedList

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;
}
于 2013-04-12T01:31:00.287 に答える