【发布时间】:2018-07-18 09:04:38
【问题描述】:
编辑:我现在意识到我在数组和指针之间造成的混淆。我很欣赏这些评论,但不会使问题更准确,因为它会失去我写它的部分原因。
我正在尝试初始化一个由结构组成的结构,每个结构都包含一个数组。更清楚地说,我有这个矩阵结构:
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之间留出多少空间?
【问题讨论】:
-
memset(d, 0, sizeof(*d));不会将您的数据归零。为此使用calloc -
这里看
arm_mat_init_f32函数定义:cs.indiana.edu/~bhimebau/CMSIS/Documentation/DSP/html/…不知道像arm_mat_release_f32这样的函数在哪里?如果这样的函数不存在,我可以猜测arm_mat_init_f32只是填充了arm_matrix_instance_f32字段并且不进行任何分配。在这种情况下你的代码是错误的,因为create_dataset函数退出后,所有pData指针都失效了。 -
但是,您需要知道您正在使用的API,提供更多信息以获得答案。
-
您的
struct中没有数组。指针不是数组。这似乎是一些裸机 MCU 系统。在这样的系统上使用malloc& co 通常是一个非常糟糕的主意。 -
无论如何,这都是一个 XY 问题。你使用了非常错误的方法。
标签: c memory-management struct arm cmsis