我有一个函数test
,它接受一个指向结构的指针。如何在嵌套结构数组中的结构中设置字段的值?结构在别处创建和删除,我只想设置值。
typedef struct {
int a;
} inner_struct_t;
typedef struct {
int b;
inner_struct_t innerStructsArr[];
} outer_struct_t;
void test(outer_struct_t *outerStruct);
void test(outer_struct_t *outerStruct) {
outerStruct->b = 123; // set a value in the outer struct
(outerStruct->innerStructsArr)[0].a = 456; // but this DOESN'T work
}
答案 0 :(得分:2)
以下是一个适合您的完整示例:
#include <stdio.h>
#include <malloc.h>
typedef struct {
int a;
} inner_struct_t;
typedef struct {
int b;
inner_struct_t *innerStructsArr;
} outer_struct_t;
void test(outer_struct_t *outerStruct, int n) {
outerStruct->b = 123; // set a value in the outer struct
outerStruct->innerStructsArr = malloc(sizeof(inner_struct_t) * n); // Allocate space
outerStruct->innerStructsArr[0].a = 456; // Assign a value
}
int main (int argc, char *argv[]) {
outer_struct_t s;
test(&s, 1);
printf("b=%d, inner[0]=%d\n", s.b, s.innerStructsArr[0].a);
free(s.innerStructsArr);
return 0;
}
答案 1 :(得分:1)
如果您的结构中包含灵活的数组成员(FAM),则需要在为结构分配空间的同时为数组分配空间。
ISO / IEC 9899:2011§6.7.2.1结构和联合说明符
¶18作为一种特殊情况,具有多个命名成员的结构的最后一个元素可以 有一个不完整的数组类型;这称为灵活数组成员。在大多数情况下, 灵活的数组成员被忽略。特别是,结构的大小就像是 省略了灵活的数组成员,除了它可能有更多的尾随填充 遗漏意味着。但是,当
.
(或->
)运算符具有左操作数时 (指向)具有灵活数组成员和右操作数名称的结构 成员,它的行为好像该成员被替换为最长的数组(具有相同的 元素类型)不会使结构大于被访问的对象;该 数组的偏移量应保持灵活阵列成员的偏移量,即使这会有所不同 从替换阵列的。如果此数组没有元素,则表现得好像 它有一个元素,但如果有任何尝试访问它,行为是未定义的 元素或生成一个经过它的指针。
假设:
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int a;
} inner_struct_t;
typedef struct
{
int b;
inner_struct_t innerStructsArr[];
} outer_struct_t;
static void test(outer_struct_t *outerStruct)
{
outerStruct->b = 123;
outerStruct->innerStructsArr[0].a = 456;
}
int main(void)
{
outer_struct_t *os = malloc(sizeof(*os) + 4 * sizeof(os->innerStructsArr[0]));
for (int i = 0; i < 4; i++)
os->innerStructsArr[i].a = 10 * i;
test(os);
printf(" b = %d\n", os->b);
for (int i = 0; i < 4; i++)
printf("[%d].a = %d\n", i, os->innerStructsArr[i].a);
free(os);
return 0;
}
示例输出:
b = 123
[0].a = 456
[1].a = 10
[2].a = 20
[3].a = 30