【问题标题】:creating an ADT using its function - C使用其功能创建 ADT - C
【发布时间】:2012-06-09 12:10:22
【问题描述】:

所以,我正在尝试在堆中编写一个返回指向 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。

【问题讨论】:

    标签: c abstract-data-type


    【解决方案1】:
    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
    

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

    【讨论】:

    • 必须是指针,否则返回指针时会丢失(卡住的帧会丢失)
    • @kirill:您现在有两个间接级别(即指向结构的指针的指针),而您可能只需要一个(即指向结构的指针)。
    • 好吧,这行得通,但我不明白为什么,你能解释一下吗?
    • @kirill:这个函数的目的是创建一个新的结构实例,对吧?所以你需要动态分配一个,并返回它的地址。但是你不需要动态分配指针。
    【解决方案2】:

    你不应该同时使用*和->,一个就足够了

    ptr->value = 5 
    

    (*ptr).value = 5
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 2012-01-23
      • 2018-05-12
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      相关资源
      最近更新 更多