【问题标题】:Variable-length array in file scope?文件范围内的可变长度数组?
【发布时间】:2012-09-11 14:29:41
【问题描述】:

例如,我有这个代码。

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

【问题讨论】:

    标签: c scope


    【解决方案1】:

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

    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);
    }
    

    【讨论】:

    • 如果你想这样做,数组定义应该是 int* 数组,现在你将 malloc 分配给一个错误的数组;或者你应该把 int array[];在标准的更高版本(我认为是 C99)中允许的结构的末尾,但是你应该以正确的方式分配整个结构,而不仅仅是数组。
    • @wich:是的,这是我在您发表评论之前修复的错字(复制了 OP 的定义并忘记更改它)。我没有理由在这里使用灵活的数组,只会让事情变得更复杂。
    • 太棒了,我已经测试过了,它确实让我可以做我想做的事。谢谢。但我相信你的意思是“TEST *p;”和“...sizeof(int)”,post 中的代码无法编译。编辑:另外,我必须添加“p = malloc(sizeof(TEST));”在“TEST *p”之后使其工作。
    • @Heinlein:我没有写TEST *p;,我写了TEST p;,也就是说,我没有动态分配TEST结构。如果你需要,那么你可以,但我认为在你的例子中没有理由。
    【解决方案2】:

    您确实不能在文件范围内定义可变长度数组,但是您可以在文件范围内定义一个指针并对其进行 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 中经常遇到的数据。

    【讨论】:

    • >您确实不能在文件范围 Thx 中定义变量数组,这正是我想听到的。指针解决方案在我的情况下不起作用 - 我已经简化了示例,在我的代码中我需要一个完整的结构。但我会记住的。
    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 2012-11-18
    • 1970-01-01
    • 2013-01-04
    • 2019-09-08
    • 2017-11-04
    相关资源
    最近更新 更多