【发布时间】:2016-08-25 08:39:10
【问题描述】:
在下面的程序中实际发生了什么,我在代码和 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 编译器 允许。为什么?
只是好奇,到底发生了什么?
【问题讨论】:
-
C 标准允许这样做。搜索“灵活数组成员”。
-
Flexible array member,有两个建议:不要投射
malloc,不要用typedefs隐藏指针 -
作为结构体的最后一个成员,在结构体存储可变数据量的情况下很有用。
-
@AlterMann 谢谢先生,我不知道这个话题..
-
这是一个C99 feature;在过时的 C 编译器(尤其是 Microsoft Visual Studio 的某些版本)中不可用。