为了账号安全,请及时绑定邮箱和手机立即绑定

结构体中未调整大小的数组声明

结构体中未调整大小的数组声明

C
汪汪一只猫 2019-11-04 10:30:30
为什么C允许这样做:类型定义结构{  int arr [];} s;arr没有指定数组大小的地方?
查看完整描述

3 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

这是C99的功能,称为灵活数组,主要功能是允许使用可变长度数组,如struct和R. 内部的功能。在对灵活数组成员的另一个问题的回答中,提供了使用灵活数组而不是指针的一系列好处。该草案C99标准的部分6.7.2.1 结构和联合说明段16说:


作为一种特殊情况,具有多个命名成员的结构的最后一个元素可能具有不完整的数组类型;这称为灵活数组成员。在大多数情况下,柔性数组成员将被忽略。特别地,该结构的尺寸就好像省略了柔性阵列构件,除了其可能具有比省略所暗示的更多的尾随填充。[...]


因此,如果您有一个s*,除了为struct所需的空间外,您还将为数组分配空间,通常在结构中还会有其他成员:


s *s1 = malloc( sizeof(struct s) + n*sizeof(int) ) ;

该标准草案实际上在第17段中具有指导性的示例:


示例声明后:


  struct s { int n; double d[]; };

结构struct s具有灵活的数组成员d。一种典型的使用方法是:


   int m = /* some value */;

   struct s *p = malloc(sizeof (struct s) + sizeof (double [m]));

并假设malloc成功调用了该对象所指向的对象p ,在大多数情况下,其行为就像p已声明为:


    struct { int n; double d[m]; } *p;

(在某些情况下,此等价关系将被破坏;尤其是,成员的偏移量d可能会不同)。


查看完整回答
反对 回复 2019-11-04
?
九州编程

TA贡献1785条经验 获得超4个赞

我很好奇Dennis Ritchie将提倡什么而不是struct hack?恕我直言,最好的选择是使编译器不拥挤零大小的数组声明,在这种情况下,编译器可以安全地假设,如果结构中的数组的声明大小为N,则不会尝试访问任何元素超出N-1u空间或占用空间的最后一个,以较低者为准。

查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 767 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信