1

例如,我有这个代码。

#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在文件范围内似乎,你知道的,很整洁。

4

2 回答 2

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);
}
于 2012-09-11T06:02:28.520 回答
1

您确实不能在文件范围内定义可变长度数组,但是您可以在文件范围内定义一个指针并对其进行 malloc,只需定义一个全局指针int* p = NULL;(丢失整个 TEST 内容)并p = malloc(sizeof(int) * input_size);简单地使用p[x].

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

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

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

typedef struct {
    other_type other_data
    int array[];
} TEST;

...

TEST *p = malloc(sizeof(TEST) + sizeof(int) * input_size);

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

这最初主要用于带有标题的数据,例如在文件和/或网络 I/O 中经常遇到的数据。

于 2012-09-11T06:03:18.687 回答