在 C 中取消引用指定结构初始值设定项内的指针

Dereferencing a pointer inside a designated struct initializer in C

假设我有以下结构

typedef struct foo {
    int    a;
    char **b;
} foo;

这就是我想要做的

char *bar0 = malloc(sizeof *bar0);
char *bar1 = malloc(sizeof *bar1);

foo f = {
    .a    = 4,
    .b    = malloc(2 * sizeof(char *)),
    .b[0] = bar0, // not allowed!
    .b[1] = bar1, // not allowed!
}

GCC 错误为 array index in non-array initializer. 我也尝试了 .(*b) = bar0.(*(b+1)) = bar1,但它们在语法上也无效。

编辑: 有没有办法在初始化器中分配 bar0bar1,而不是使用单独的赋值表达式?

b 是一个指针(指向一个指针)而不是一个数组,所以你不能使用数组指定的初始化语法。此外,您不能同时进行 run-time 分配和 malloc 初始化。

您必须执行以下操作:

char *bar0 = malloc(something_meaningful);
char *bar1 = malloc(something_meaningful);
foo f = {
    .a    = 4,
    .b    = (char*[]){ bar0, bar1 }
};

这会将 b 分配给与 f 具有相同作用域的复合文字。但是,您现在无法 re-size b 本身。如果这是一项要求,那么您必须在两个单独的步骤中执行 malloc + run-time 赋值。


请注意,如果您必须首先重新分配这 1 个字节,那么 char *bar0 = malloc(sizeof *bar0); 是毫无意义的。我建议分配一个“相当大的块”或将其设置为 NULL.

Is there any way to assign bar0 and bar1 within the initializer , and not use separate assignment expressions?

不,f.b 是指向已分配对象的指针(在本例中通过调用 malloc 返回)并且无法使用初始化器初始化已分配对象。只需删除有问题的指定初始值设定项并改用赋值表达式:

char *bar0 = malloc(sizeof *bar0);
char *bar1 = malloc(sizeof *bar1);

foo f = {
    .a    = 4,
    .b    = malloc(2 * sizeof(char *)),
};
f.b[0] = bar0;
f.b[1] = bar1;