<分区>
编辑:我现在意识到我在数组和指针之间造成的混淆。我很欣赏这些评论,但不会使问题更准确,因为它会失去我写它的部分原因。
我正在尝试初始化一个由结构组成的结构,每个结构都包含一个数组。更清楚地说,我有这个矩阵结构:
typedef struct
{
uint16_t numRows; /**< number of rows of the matrix. */
uint16_t numCols; /**< number of columns of the matrix. */
float32_t *pData; /**< points to the data of the matrix. */
} arm_matrix_instance_f32;
我需要将这些矩阵对象中的一些组合成一个更大的结构
typedef struct
{
arm_matrix_instance_f32 A;
arm_matrix_instance_f32 B;
arm_matrix_instance_f32 C;
} dataset;
作为引用,这个矩阵定义和后面用到的初始化函数,来自CMSIS中的arm_math
库。 .
我很难理解应该如何创建 dataset
变量。按照此 question page 中的答案和讨论,我知道我不能神奇地期望 C 知道要用 dataset d
之类的声明分配多少内存。
仅根据链接问题的解决方案,我想出了一个函数来为 dataset
初始化足够的空间,并使用一个函数来创建 dataset
类型的变量>。我现在有这样的东西:
dataset* create_dataset( void ) {
uint8_t n_matrices = 3;
uint8_t n_elements = 9;
dataset* d= malloc( n_matrices * (sizeof(float32_t)*n_elements + sizeof(uint16_t)*2));
memset(d, 0, sizeof(*d));
const float32_t zeros33_f32[9] =
{
0.0, 0.0, 0.0,
0.0, 0.0, 0.0,
0.0, 0.0, 0.0,
};
const float32_t zeros31_f32[3] =
{
0.0,
0.0,
0.0,
};
const float32_t zeros13_f32[3] =
{
0.0, 0.0, 0.0,
};
arm_mat_init_f32( &(d->A), 3, 3, (float32_t *)zeros33_f32);
arm_mat_init_f32( &(d->B), 3, 1, (float32_t *)zeros31_f32);
arm_mat_init_f32( &(d->C), 1, 3, (float32_t *)zeros13_f32);
return d;
}
基本上我从假设矩阵的数量和它们包含的最大元素数量都是已知的开始,因此预留足够的内存。
我有以下问题:
- 整体方法是否适用于此类嵌套结构?
dataset
结构的空间分配是否正确?- 我是否真的确保我创建的
dataset
结构中包含的所有arm_matrix_instance_f32
元素都有足够的空间容纳所有元素? - 我将该结构声明为包含
A、B、C
。如果我以另一个顺序初始化它们会怎样?例如,如果B
仍未声明,结构如何知道在A
和C
之间留出多少空间?