malloc之后的点初始化结构

时间:2018-12-02 11:48:19

标签: c memory memory-management struct

我正在尝试使用malloc分配结构,然后使用点语法对其进行初始化。我尝试了一些东西,但这似乎是不可能的。

#include <stdlib.h>
#include <stdio.h>

struct t {
  int nb;
};

struct t *foo()
{
  struct t *f = malloc(sizeof(struct t));
  *f = { .nb = 0 };
  return f;
}

int main(void)
{
  printf("%d\n", foo()->nb);
  return 0;
}

编译器说:

$ gcc -Wall -Werror -std=c99 -Wextra -pedantic test.c 
test.c:11:8: error: expected expression
  *f = { .nb = 0 };
       ^
1 error generated.

我尝试了没有取消引用的分配,但又犯了一个错误,我期望指针和非指针变量的分配不兼容,但是消息是相同的。

您负担得起一些技巧吗?

BR。

1 个答案:

答案 0 :(得分:4)

您的代码不起作用,因为严格来讲,它不是初始化,而是赋值。您需要在右侧使用一个有效的对象表达式来使其起作用,而用括号括起来的初始化器根本不是那样。但这可以很容易地通过将rhs变成复合文字来修改:

*f = (struct t){ .nb = 0 };