我有这个代码。
#include <stdlib.h>
#include <stdio.h>
#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
似乎很清楚。
答案 0 :(得分:3)
最简单的方法是动态分配内存:
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);
}
答案 1 :(得分:1)
你确实无法在文件范围定义一个可变长度数组,但你可以在文件范围定义一个指针并对其进行malloc,只需定义一个全局指针int* p = NULL;
(丢失整个测试内容)和{{1只需使用p = malloc(sizeof(int) * input_size);
进行访问。
为了完整性,您还可以使用C99中定义的所谓的灵活数组成员:
来自ISO / IEC 9899:1999,第6.7.2.1节,第16段:
作为一种特殊情况,结构的最后一个元素有多个 命名成员可能具有不完整的数组类型;这叫做a 灵活的阵列成员。
p[x]
虽然请注意,这仅限于一个成员,但如果您有多个不同类型但长度相同的数组,则可以创建一个结构数组。
这最初主要用于包含文件和/或网络I / O中遇到的标题的数据。