C:带指针的复合结构的静态初始化



我有一个嵌套的C (gcc-11)结构体,其中包含指向另一个结构体的指针数组。我想创建这种类型的静态变量,并在同一时间初始化它。所有这些都在一个头文件中。原因是它代表了属于该头文件的一些默认值。我不想调用初始化函数来设置它

下面的代码可以编译:

typedef struct s1_s {
int a;
int b;
} s1_t;
typedef struct s2_s {
int c;
s1_t *s1s; // but I need this to be **s1s really!
} s2_t;
s2_t *def = &(s2_t){
.c = 10,
.s1s = &(s1_t){  
.a = 100,
.b = 200 
} 
};
int main(void){ return 1; }

但是我想要一个指针数组:s1_t **s1s,准确地说。这不能编译:

typedef struct s1_s {
int a;
int b;
} s1_t;
typedef struct s2_s {
int c;
s1_t **s1s; // "array" of pointers
} s2_t;
s2_t *def = &(s2_t){
.c = 10,
// I want an "array" of 1 *(s1_t*) element
.s1s = &(s1_t *){{  
.a = 100,
.b = 200 
}} 
};
int main(void){ return 1; }

以下是第一个错误:

warning: braces around scalar initializer
15 |         .s1s = &(s1_t *){{
error: field name not in record or union initializer
16 |                 .a = 100,
...

就这样做:

s2_t *def = &(s2_t){
.c = 10,
// I want an "array" of 1 *(s1_t*) element
.s1s = (s1_t*[]){&(s1_t){  
.a = 100,
.b = 200 
}} 
};
  • (s1_t*[])表示复合文字的类型为"指向s1_t的指针数组"。编译器会自动推断它的大小
  • 数组的每个元素必须是指针,因此定义为&(s1_t) { ... }

相关内容

  • 没有找到相关文章

最新更新