使用函数-C创建ADT
因此,我试图在堆中编写一个返回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
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