在下面的程序中实际发生了什么,我在代码和GCC编译器中定义了一个空数组int arr[];
,但编译器没有给出错误。它成功地运作了。
#include <stdio.h>
#include <stdlib.h>
typedef struct st
{
int i;
int arr[];
}ST,*ptr;
int main()
{
ST s1;
ptr p1= (ptr)malloc(sizeof(ST)+4*sizeof(int));
p1->i=10;
p1->arr[0]=1;
p1->arr[3] = 1;
printf("%d\n",p1->arr[3]);
printf("%ld\n", sizeof(s1));
}
C
语言不允许未定义的数组长度。但允许 GCC编译器。为什么呢?
好奇,实际发生了什么?
答案 0 :(得分:3)
自C99以来它有效且被允许。它被称为flexible array member - 用于使结构的最后一个成员变长,如果使用它必须是结构的最后一个成员。
答案 1 :(得分:2)
您正在查看C99功能Flexible array member。如果数组是在结构的末尾定义的,那么你将通过malloc分配一个更大的内存块来定义它的大小。
表示大小为len
的数组:
struct st *mySt = malloc(sizeof(struct st) + len * sizeof(mySt->arr[0]));
答案 2 :(得分:1)
C99 ,最后一个元素的结构允许数组的大小未知,这被称为灵活的数组成员,但是在结构的前面灵活的阵列成员必须至少有一个其他成员。
允许结构的 灵活数组成员包含一个可变大小的数组。 sizeof 结构的此大小不包括灵活的内存数组。包含使用malloc ()
函数的灵活数组成员的结构动态分配内存并且分配内存应该大于结构的大小以适应灵活数组的预期大小。
基本型号
typedef struct st
{
int i;
int arr[];
}ST,*ptr;
在linux下测试gcc关于结构的运算结果,数组的最后一个元素,以及一个未定义长度的数组,运算结果与理论一致,这有点像ac ++类的成员函数,成员函数不是占用的班级空间大小。好吧,这个灵活的阵列,有什么作用。