我有以下结构,并尝试使用malloc动态创建一个新对象。现在似乎可以使用 object_ptr obj_ptr1 = malloc(sizeof(object_ptr)); 这只将object_ptr的指针大小分配给obj_ptr1?但在这种情况下如何指定原始struct _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));
答案 0 :(得分:4)
指针类型的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
作为指针和结构类型,无疑会造成混淆。)
答案 1 :(得分:0)
问题在于你的malloc系列。您必须分配sizeof(_object_t)
而不是sizeof(object_t)