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

时间:2012-09-11 05:57:46

标签: c scope

我有这个代码。

#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似乎很清楚。

2 个答案:

答案 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中遇到的标题的数据。