【问题标题】:how to use malloc on a pointer correctly?如何在指针上正确使用 malloc?
【发布时间】:2014-03-08 13:23:55
【问题描述】:

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

【问题讨论】:

  • 您可以通过将指针声明为指针并通过not casting the return value of malloc() 来做到这一点。
  • 编辑后:现在它是一个指针,但您仍然分配了错误的大小。您正在分配指向struct _object_t 的指针的大小。也许你应该使用更有说服力的名字,比如struct object_tobject_ptr
  • 谢谢,我看到我的问题中的malloc只将object_ptr的大小分配给obj_ptr1,但是如何分配原始struct _object_t的大小呢?
  • @TonyGW 好吧,准确地写下sizeof(_object_t)
  • @Nabla,我也可以写 malloc(sizeof(object_ptr*)) 吗?隐藏原始结构名称对我来说很重要。谢谢

标签: c pointers struct malloc


【解决方案1】:

指针类型的类型定义通常不是一个好主意,因为它们会让人很难判断类型名称是否引用指针类型。

建议:

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,无疑会造成混淆。)

【讨论】:

    【解决方案2】:

    问题出在你的 malloc 行。你必须分配sizeof(<strong>_object_t</strong>) 而不是sizeof(object_t)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 2012-02-20
      • 2012-01-05
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      相关资源
      最近更新 更多