在结构中初始化指针成员

时间:2017-10-05 18:54:34

标签: c pointers initialization

我正在尝试编写一个从微控制器读取特定地址值的模块,初始化代码已经自己编译但是当我尝试在一个结构中编译它似乎抱怨。初始化结构中的指针是否有限制?

#include <stdio.h>
#include <esper.h>
#include <stdlib.h>
#include <stdint.h>
#include "lmk04800.h"

#define NUM_MSS_GPIO 32

#define SEL_NIM     3
#define SOURCE_SEL  4
#define SEL_EXT     5
#define CLK0_3_EN   6
#define CLK4_7_EN   7
#define CLK8_11_EN  8
#define CLK12_15_EN 9
#define CLK16_19_EN 10
#define CLK20_23_EN 11
#define LMK_SYNC    12

typedef struct {
  int fd_gpio[NUM_MSS_GPIO];
  uint8_t data_gpio[NUM_MSS_GPIO];
  uint32_t esata_freqCounter;
  uint32_t ext_freqCounter;
  uint32_t esata_trgCounter;
  uint32_t ext_trgCounter;

  tLMK04800 settings;
  volatile uint32_t *freqCounter_addr;
  volatile uint32_t *trgCounter_addr;
  volatile uint32_t *manSync_addr;
  freqCounter_addr = (volatile uint32_t *)0x30000000;
  trgCounter_addr = (volatile uint32_t *)0x30000100;
  manSync_addr = (volatile uint32_t *)0x30000200;

 } tESPERModuleTest;

我得到的编译错误是:

test/mod_test.h:32: error: expected specifier-qualifier-list before 'freqCounter_addr'

1 个答案:

答案 0 :(得分:1)

定义类型时,不能为struct成员定义初始值。如果允许它可能很有用,并且初始值将自动应用于该类型的任何对象。 C只是不允许。

您只能初始化对象。

您已定义了名为tESPERModuleTest的类型。如果要定义和初始化该类型的对象,可以在定义类型(未经测试的代码)后执行类似的操作:

tESPERModuleTest obj = {
    .freqCounter_addr = (volatile uint32_t *)0x30000000,
    .trgCounter_addr = (volatile uint32_t *)0x30000100,
    .manSync_addr = (volatile uint32_t *)0x30000200
};

(其他成员将默认为零初始化,或者您可以为它们提供值。)