【问题标题】:Initializing a pointer at declaration time in a C struct在 C 结构中的声明时初始化指针
【发布时间】:2017-08-04 08:05:54
【问题描述】:

有没有办法在声明时初始化 C 结构中的指针:

struct person
{
  uint8_t age;
  uint16_t * datablock;
} mike = { 2, malloc(4) };

我已经尝试了上面的代码,但我得到了:

初始化元素对于数据块成员来说不是常量。

我正在使用 GCC。

【问题讨论】:

  • 您正在调用函数malloc(),但初始化器必须是编译时常量。
  • 文件范围初始化器必须由常量组成。
  • 代码是否需要稍后更改mike.datablock 以指向分配的内存?

标签: c pointers struct malloc


【解决方案1】:

如何在声明时初始化结构的成员

您可以在声明时通过编译时常量初始化结构的成员,如下代码所示:

struct person
{
  uint8_t age;
  uint16_t * datablock;
} mike = { 2, NULL };

为什么你的代码无法编译?

然而,

malloc(4) 是一个函数调用,它将在运行时 执行。因此,您得到的错误信息确实非常准确。


运行时分配的替代方案

但是你可以这样做:

#define NUM 2 // change NUM at will
static uint16_t data[NUM]; // memory that will be allocated

struct person
{
  uint8_t age;
  uint16_t * datablock;
} mike = { 2, data };

请注意,在这种情况下,data 的地址在编译时是已知的,因此您可以将其用作结构成员的初始化程序。

【讨论】:

  • 我明白了,谢谢。但是在编译时我分配了 8 位来保存年龄值。我如何为具有自定义大小的自定义类型执行此操作?
  • @moonraker 通过更改上面代码中的NUM,您可以自定义要分配的大小。
猜你喜欢
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多