如何正确使用指针上的malloc?

时间:2014-02-10 23:48:42

标签: c pointers struct malloc

我有以下结构,并尝试使用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));

2 个答案:

答案 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)