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 に答える