编辑:此解决方案不符合 MISRA-C 规则。
您可以在结构定义中包含 VLA,但前提是它位于函数内部。解决此问题的一种方法是在主结构的末尾使用“灵活数组成员”,如下所示:
#include <stdio.h>
struct my {
int len;
int array[];
};
您可以创建对该结构进行操作的函数。
void print_my(struct my *my) {
int i;
for (i = 0; i < my->len; i++) {
printf("%d\n", my->array[i]);
}
}
然后,要创建此结构的可变长度版本,您可以在函数体中创建一种新类型的结构,其中包含您的my
结构,但也定义该缓冲区的长度。这可以通过不同的大小参数来完成。然后,对于您调用的所有函数,您只需传递一个指向包含struct my
值的指针,它们就会正常工作。
void create_and_use_my(int nelements) {
int i;
// Declare the containing struct with variable number of elements.
struct {
struct my my;
int array[nelements];
} my_wrapper;
// Initialize the values in the struct.
my_wrapper.my.len = nelements;
for (i = 0; i < nelements; i++) {
my_wrapper.my.array[i] = i;
}
// Print the struct using the generic function above.
print_my(&my_wrapper.my);
}
您可以使用任何值调用此函数,nelements
它会正常工作。这需要 C99,因为它确实使用 VLA。此外,还有一些GCC 扩展使这更容易一些。
重要提示:如果您将 传递struct my
给另一个函数,而不是指向它的指针,我几乎可以保证它会导致各种错误,因为它不会复制可变长度数组。