C结构中动态数组内结构中动态分配数组的语法

时间:2016-11-14 19:28:56

标签: c arrays dynamic struct

我有一个C语法问题让我发疯。我已经定义了一些容器结构:

typedef struct AStruct {
    int importantData1;
    int importantData2;
} A;

typedef struct BStruct {
    A* arr1;                // dynamic array of A structs
} B;

typedef struct CStruct {
    B* arr2;                // dynamic array of B structs
} C;

你可以猜到,每个A结构都包含我程序数据的一部分。每个B结构都包含一个A的数组,每个C结构包含一个B的数组。我预计只需要一个C结构。因此,我的C结构的数据总量将是:

total data in C  ==  (num of B's) * (num of A's)

棘手的部分是我不知道在编译时我需要多少A和B.这意味着我不能硬连接数组大小;它们必须动态分配。

必须有办法做到这一点。这是我笨重的尝试:

void makeContainers(C* x, int numB, int numA){
    x->arr2 = (B*)malloc(numB * sizeof(B));   // allocate an array of empty B structs
    B* Bptr;
    int i;
    for(i=0; i<numB; i++){
            Bptr = x->arr2[i];                      // Bptr is one of the B's in C's arr2
            Bptr = (A*)malloc(numA * sizeof(A));    // Allocate an array of empty A stucts
    }
}

int main() {
    C* bigContainer = (C*)malloc(sizeof(C));    // Allocate the C struct
    makeContainers(bigContainer, 8, 8);         // populate C with B's and A's

    return 0;
}

这看起来很棒...但编译器讨厌Bptr = x->arr2[i];行。 (在Linux上使用GCC进行编译)这是错误:

[Linux]$ gcc -Wall setsInSets.c
setsInSets.c: In function ‘makeContainers’:
setsInSets.c:23:8: error: incompatible types when assigning to type ‘struct B *’ from type ‘B’
   Bptr = x->arr2[i];   // Bptr is one of the B's in C's arr2
        ^

从类型B输入结构B ”部分让我困惑。不知道编译器在这里试图告诉我什么。

另外......这有点像C 101型问题,但我不确定我是否完全理解makeContainers()中的第一行是什么:

x->arr2 = (B*)malloc(numB * sizeof(B));

这里我为一个B结构数组分配内存......但这是否意味着当这个命令完成时,我确实有一个“空”B结构阵列准备好了?或者我只是留出内存,但内存本身只包含“垃圾”?换句话说,我是否必须遍历x->arr2数组和malloc()个体B结构?

我知道这可能是一个重复的问题 - 但无论如何我都会问它,因为我认为“动态数组中动态数组中的结构体”这个问题的性质非常具体。

谢谢! -Pete

1 个答案:

答案 0 :(得分:3)

x->arr2是指向B结构数组的指针

x->arr2[i]取消引用数组中的一个元素,即B结构

要设置指针,您需要结构的地址

B* Bptr = &(x->arry[i]);

或更方便

B* Bptr = x->arry + i;

我建议您在结构中编写数组的大小,稍后可能会派上用场。

e.g。

typedef struct BStruct {
    size_t elements;        // to know how many A structs 
    A* arr1; 
} B;

编辑:

这部分代码

Bptr = x->arr2 + i;         // Bptr is one of the B's in C's arr2
Bptr = malloc(numA * sizeof(A)); 

毫无意义,你首先分配Bptr,然后将其分配给另一个地址。