在 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
,但它们在语法上也无效。
编辑:
有没有办法在初始化器中分配 bar0
和 bar1
,而不是使用单独的赋值表达式?
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;
假设我有以下结构
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
,但它们在语法上也无效。
编辑:
有没有办法在初始化器中分配 bar0
和 bar1
,而不是使用单独的赋值表达式?
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
andbar1
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;