将值分配给嵌套结构数组中的字段

时间:2016-08-09 04:04:36

标签: c pointers struct

我有一个函数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
}

2 个答案:

答案 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