0

そこで、ADTへのポインタを返す関数をヒープ内に書き込もうとしています。

問題は、メモリ割り当て後に操作できないことです。これが簡略化されたコードです

typedef struct _entity {
    int value;
} *Entity;


Entity *new_entity() {
    Entity *ptr = (Entity*)malloc(sizeof(struct _entity));
    assert( ptr );

    (*ptr)->value = 5; // program crashes after this line

    return ptr;
}

エラーは次のとおりです。

test.exeの0x013e1665で未処理の例外:0xC0000005:アクセス違反の書き込み場所0xcdcdce21。

4

2 に答える 2

8
typedef struct _entity {
    int value;
} *Entity;
  ^
  ^

あなたはおそらくこれを望んでいません*。それ以外の場合はEntity、構造体ではなく、構造体へのポインターになるように型定義しています。したがって、コードは次のようになります。

typedef struct _entity {
    int value;
} Entity;


Entity *new_entity(void) {
    Entity *ptr = malloc(sizeof(*ptr));
    assert( ptr );

    ptr->value = 5;

    return ptr;
}

何らかの理由でポインター型になりたい場合Entityは、コードの残りの部分が間違っています。ポインター用にいくらかのスペースを割り当てましたが、それが指しているもの用ではありません。次のようにする必要があります。

Entity *ptr = malloc(sizeof(*ptr));  // Allocate an Entity
*ptr = malloc(sizeof(**ptr));        // Allocate a *Entity

しかし、これを行う必要はほとんどありません。

于 2012-06-09T12:13:01.943 に答える
0

* と -> の両方を使用しないでください。どちらか一方で十分です

ptr->value = 5 

また

(*ptr).value = 5
于 2012-06-09T12:14:23.793 に答える