Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用函数-C创建ADT_C_Abstract Data Type - Fatal编程技术网

使用函数-C创建ADT

使用函数-C创建ADT,c,abstract-data-type,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 crashe

因此,我试图在堆中编写一个返回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:Access 写入位置0xcdcdce21时发生冲突

你可能不想要这个*。否则,您将实体类型定义为指向结构的指针,而不是结构。因此,您的代码将变成:

typedef struct _entity {
    int value;
} Entity;


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

    ptr->value = 5;

    return ptr;
}
如果出于某种原因,您确实希望实体是指针类型,那么代码的其余部分就错了。您已经为指针预留了一些空间,但没有为指针指向的内容预留空间。它需要更像这样:

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

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

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

ptr->value = 5 


它必须是一个指针,否则当我返回指针时,它将丢失,而卡住的帧将丢失lost@kirill:您现在有两个级别的间接寻址,即指向结构的指针,而您可能只需要一个级别的间接寻址,即指向结构的指针。嗯,这很有效,但我不明白为什么,你能解释一下吗?@kirill:这个函数的目的是创建一个新的struct实例,对吗?所以您需要动态分配一个,并返回其地址。但您不需要动态分配指针。
ptr->value = 5 
(*ptr).value = 5