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

结构不能有动态成员,所以试试 const int b = 10;

于 2013-11-09T19:16:49.507 回答