我有一个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
答案 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,然后将其分配给另一个地址。