私は次のコードを持っています:
int b = 10; // maximum branching
typedef struct depth * depth;
struct depth{
int number ;
depth child[b] ;//<---- Error here
};
および次のエラー:
variably modified ‘child’ at file scope
私は次のコードを持っています:
int b = 10; // maximum branching
typedef struct depth * depth;
struct depth{
int number ;
depth child[b] ;//<---- Error here
};
および次のエラー:
variably modified ‘child’ at file scope
代わりにこれを試してください:
#define MAX_BRANCHING 10
int b = MAX_BRANCHING; // maximum branching
typedef struct depth * depth;
struct depth{
int number ;
depth child[MAX_BRANCHING] ;//<---- Error here
};
「可変長配列」(VLA) は C99 と C11 で導入されましたが、その使用は「条件付き」です (機能を実装するためにコンパイラは必要ありません)。C++ では、"const int" を使用することをお勧めします。C では、 を使用することをお勧めし#define
ます。私見では...
定数にすることができず、子配列にヒープ割り当てb
を使用したくない場合は、これを使用できますが、かなり独特の回避策です (ヒント: これを使用しないで、配列にヒープ割り当てを使用することを検討してください)。
typedef struct depth *depth_p;
struct depth
{
int number;
depth_p child[0];
};
秘訣は、次のステートメントがまだ有効であることです。
depth_p d = get_depth();
d->child[5]; // <-- this is still valid
これを使用するにはdepth_p
、この (そしてこれのみ) の方法でのインスタンスを作成する必要があります。
depth_p create_depth(int num_children)
{
return (depth_p)malloc(
sizeof(struct depth) + num_children * sizeof(depth_p)
);
}
まず、これにより、他のすべてのメンバー ( int number
) にメモリが割り当てられますsizeof(struct depth)
。次に、 を追加して、必要な量の子に追加のメモリを割り当てます。 num_children * sizeof(depth_p)
depth
で参照を解放することを忘れないでくださいfree
。
Sructs は動的メンバーを持つことができないため、const int b = 10; を試してください。