【问题标题】:C malloc a struct from its typedefC malloc 从其 typedef 中分配一个结构
【发布时间】:2025-12-21 05:05:06
【问题描述】:

给定以下结构

struct foo
{
  int b;
  int a;
  int r;
};

我想从这个结构中创建一个新类型,如下所示

typedef struct foo * foo_t;

也就是说foo_t应该等于struct foo的指针。
所以struct foo *var; foo_t var;

为什么我不能从它的类型中分配这个结构?

foo_t var = malloc(sizeof(*foo_t));在编译时抛出错误

错误:foo_t之前的预期表达式
foo_t var = malloc(sizeof((*_foo_t)));

【问题讨论】:

  • foo_t 等于一个指针。我们需要 malloc 结构的大小,而不是指针
  • 谢谢大家
  • ... 这正是我不喜欢将指针隐藏在 typedef 后面的原因。 :-)
  • 我正在制作面向对象 C,我更喜欢强制使用指针 ;)
  • 我不认为我在做的是那么糟糕:gist.github.com/Romain-P/dd16dd4f1102c36d170c5e41d989c6b9

标签: c struct


【解决方案1】:

因为sizeof 的操作数必须是表达式或带括号的类型名称。 *foo_t 两者都不是。

我强烈建议不要将指针隐藏在 typedef 后面。但是,您可以执行以下操作:

foo_t var = malloc(sizeof *var);

var 不是一个类型,所以*var 是一个有效的表达式。

【讨论】:

  • 你需要在sizeof(*var)添加括号
  • @Bizzu 不,我没有。
【解决方案2】:

您必须为类型为 foo_t 而不是大小为 sizeof(*foo_t) 的变量分配一部分大小为 sizeof(struct foo) 的内存。使用函数 malloc,您可以分配指针指向的一部分内存(具有确定的输入大小)。您的变量 var 是 foo_t 类型,即指向 struct foo 结构的指针。 所以分配变量var的正确语法是:

foo_t var=malloc(sizeof(struct foo));

【讨论】: