使用其功能创建ADT - C.

Kir*_*kov 0 c abstract-data-type

所以,我正在尝试编写一个函数,该函数在堆中返回指向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;
}
Run Code Online (Sandbox Code Playgroud)

错误是:

test.exe中0x013e1665处的未处理异常:0xC0000005:访问冲突写入位置0xcdcdce21.

Oli*_*rth 8

typedef struct _entity {
    int value;
} *Entity;
  ^
  ^
Run Code Online (Sandbox Code Playgroud)

你可能不想要这个*.否则,您将typedefing Entity为指向结构的指针,而不是结构.所以你的代码将成为:

typedef struct _entity {
    int value;
} Entity;


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

    ptr->value = 5;

    return ptr;
}
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因,您确实希望Entity成为指针类型,那么代码的其余部分是错误的.你已经为指针设置了一些空间,但不是它所指向的空间.它需要更像这样:

Entity *ptr = malloc(sizeof(*ptr));  // Allocate an Entity
*ptr = malloc(sizeof(**ptr));        // Allocate a *Entity
Run Code Online (Sandbox Code Playgroud)

但几乎可以肯定没有必要这样做.