1

私は次のコードを持っています:

int b = 10; // maximum branching 

typedef struct depth * depth;

struct depth{
    int number ;
    depth child[b] ;//<---- Error here 
};

および次のエラー:

variably modified ‘child’ at file scope
4

3 に答える 3

1

代わりにこれを試してください:

#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ます。私見では...

http://en.wikipedia.org/wiki/Variable-length_array

于 2013-11-09T19:12:59.440 に答える
1

定数にすることができず、子配列にヒープ割り当て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

于 2013-11-09T19:38:19.180 に答える
0

Sructs は動的メンバーを持つことができないため、const int b = 10; を試してください。

于 2013-11-09T19:16:49.507 に答える