文件范围内的可变长度数组?

我有这个代码的例子。

#include  #include  #define array_size 3 typedef struct { int array[array_size]; } TEST; void printout(TEST *p, int element) { printf("element: %i\n", p->array[element]); } int main(void) { TEST *p; p = malloc(sizeof(TEST)); p->array[0] = 5; printout(p, 0); return 0; } 

但我想根据用户输入分配"array_size"

如果我尝试这样做,编译器会说"variably modified 'array_size' at file scope" 。 所以,我是对的,做我想要的唯一方法是将所有东西都移到main()..?

它工作得很好,但是在文件范围内保留structs and functions declarations似乎很简单。

最简单的方法是动态分配内存:

 typedef struct { int *array; size_t size; } TEST; int main() { size_t elem_count = /* from user input */ TEST p; p->array = malloc(elem_count * sizeof int); if(!p->array) return -1; p->size = elem_count; /* ... */ free(p->array); } 

你确实无法在文件范围定义一个可变长度数组,但是你可以在文件范围定义一个指针并使用malloc它,只需定义一个全局指针int* p = NULL; (丢失整个TEST的东西)和p = malloc(sizeof(int) * input_size); 只需用p[x]访问。

为了完整起见,您还可以使用C99中定义的所谓的灵活数组成员:

来自ISO / IEC 9899:1999,第6.7.2.1节,第16段:

作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型; 这称为灵活的arrays成员。

 typedef struct { other_type other_data int array[]; } TEST; ... TEST *p = malloc(sizeof(TEST) + sizeof(int) * input_size); 

虽然请注意,这仅限于单个成员,但如果您有其他类型但长度相同的多个数组,则可以创建一个结构数组。

这最初主要用于包含文件和/或网络I / O中遇到的标题的数据。