我有以下结构,并尝试使用 malloc 动态创建一个新对象。它现在似乎适用于 object_ptr obj_ptr1 = malloc(sizeof(object_ptr));这仅将object_ptr的指针大小分配给obj_ptr1 ?但是在这种情况下,如何分配原始结构_object_t的大小?
typedef struct
{
int struct_id;
void *(*function)(void *);
int status;
} _object_t;
typedef struct _object_t* object_ptr;
/* create a new object */
object_ptr obj_ptr1 = malloc(sizeof(object_ptr));
指针类型的 Typedef 通常是一个坏主意,因为它们会使判断类型名称是否引用指针类型变得困难。
建议:
typedef struct { /* ... */ } object_t;
object_t *obj1 = malloc(sizeof *obj1);
如果要为N个对象的数组分配空间:
object_t *obj1 = malloc(N * sizeof *obj1);
请注意,我已从类型名称中删除了前导下划线。以下划线开头的标识符保留给实现;不应在自己的代码中定义它们。
malloc(sizeof *foo)
习语可能需要一点时间来适应,但这意味着您不必多次指定类型名称,从而避免错误。(*obj1
实际上并没有取消引用obj1
,因为没有计算sizeof
的操作数。
在您的代码中:
object_t obj1 = malloc(sizeof(object_t));
由于object_t
是指针类型,因此需要分配足够的内存来保存指针对象,而不是结构对象。(对指针和结构类型分别使用如此相似的名称object_t
和_object_t
,无疑导致了混淆。
问题出在您的 malloc 行中。您必须分配sizeof(_object_t)
而不是sizeof(object_t)