编辑:我现在意识到我在数组和指针之间造成的混淆。我很欣赏这些评论,但不会使问题更准确,因为它会失去我写它的部分原因。
我正在尝试初始化一个由每个包含一个数组的结构组成的结构。更清楚的是,我有这个矩阵结构:
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;
作为参考,这个矩阵定义和后面使用的初始化函数,来自CMSISarm_math
中的库。
我很难理解我应该如何创建一个dataset
变量。按照这个问题页面中的答案和讨论,我知道我不能神奇地期望 C 知道要分配多少内存,例如dataset d
.
只遵循链接问题的解决方案,我想出了一个函数来为 a 初始化足够的空间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
正确? - 我是否真的确保我创建
arm_matrix_instance_f32
的结构中包含的所有元素dataset
都有足够的空间容纳它们的所有元素? - 我将结构声明为包含
A, B, C
. 如果我以另一个顺序初始化它们会发生什么?例如,结构如何知道之间留有多少空间A
以及C
是否B
仍未声明?