c代码出错

时间:2013-11-09 19:10:05

标签: c

我有以下代码:

int b = 10; // maximum branching 

typedef struct depth * depth;

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

并出现以下错误:

variably modified ‘child’ at file scope

3 个答案:

答案 0 :(得分: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。 IMHO ...

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

答案 1 :(得分: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个引用。

答案 2 :(得分:0)

Sructs不能拥有动态成员,所以请尝试const int b = 10;