【发布时间】:2015-04-07 14:03:43
【问题描述】:
我必须说,我在一个看似基本的问题上遇到了一个难题。我有一个结构,我想将一个数组存储为一个字段。我想在不同的上下文中重用这个结构,有时我需要一个更大的数组,有时需要一个更小的数组。 C 禁止使用可变大小的缓冲区。因此,自然的方法是将指向该数组的指针声明为结构成员:
struct my {
struct other* array;
}
然而,这种方法的问题是我必须遵守 MISRA-C 的规则,它禁止动态内存分配。那么如果我想分配内存并初始化数组,我不得不这样做:
var.array = malloc(n * sizeof(...));
这是 MISRA 标准所禁止的。我还能怎么做?
【问题讨论】:
-
"C 禁止使用可变大小的缓冲区" ,只是 ANSI-C 或 C89 禁止这样做。 VLA(可变长度数组)从 C99 开始存在
-
对。但无论如何,我不能在结构定义中这样设置它,因为它无论如何都无法访问该变量。
-
在编译时是否知道不同的大小(
n)? -
不,它实际上是必需,而不是建议限制。
-
MIRA 确实允许指针不是吗,你能有一个指向 VLA var.array = a[n] 的指针吗?
标签: c arrays static malloc misra