获取struct中列表结构的大小

时间:2015-10-07 10:57:00

标签: c

我有以下结构:

struct Student{
 char *name;
 int age;
};
struct Class{
 char *class_name;
 struct Student students[];
};

还有一个计数功能:

int countStdInClass(struct Class *classA){
  int sizeOfStd = sizeof(classA->students)/sizeof(classA->students[0])
  return sizeOfStd ;
}

编译时,发生错误:

invalid application of ‘sizeof’ to incomplete type ‘struct Student[]'

请帮我纠正。 感谢。

2 个答案:

答案 0 :(得分:2)

1。struct Class -

struct Student students[ ];
 /*                     ^ you haven't given any size .  */

当您将元素用作sizeof的操作数时,需要提供多个元素。示例 -

struct Student students[5];    // give any desired size 

2。也在您的函数int countStdInClass -

int sizeOfStd = sizeof(classA->students)/sizeof(classA->students[0])
 /*                                                                 ^ ; missing   */

答案 1 :(得分:0)

C标准明确指出(6.7.2.1)在获取sizeof结构时不计算灵活的数组成员:

  

特别是,结构的大小就像柔性阵列一样   成员被省略,除了它可能有更多的尾随填充   遗漏意味着。

如果动态分配内存,则只使用灵活的数组成员是有意义的。至于动态内存的所有其他情况,在分配的段上使用sizeof运算符没有任何意义。

使用灵活数组成员students时,必须将内存分配为:

struct Class* c = malloc( sizeof(*c) + n*sizeof(struct Student) );

意思是你已经知道了它的大小!它是n*sizeof(struct Student)