0长度的数组在ISO C和C++的规格说明书中是不允许的,但是由于gcc 预先支持C99的这种玩法,所以,“零长度数组”在gcc环境下是合法的。
先看下面两个例子。
pzeroLengthArray.c
#include <stdio.h>
struct str
{
int len;
char *s;
};
struct foo
{
struct str *a;
};
int main()
{
struct foo f = {0};
printf("sizeof(struct str) = %d\n", sizeof(struct str));
printf("before f.a->s.\n");
if(f.a->s)
{
printf("before printf f.a->s.\n");
printf(f.a->s);
printf("before printf f.a->s.\n");
}
return 0;
}
zeroLengthArray.c
#include <stdio.h>
struct str
{
int len;
char s[0];
};
struct foo
{
struct str *a;
};
int main()
{
struct foo f = {0};
printf("sizeof(struct str) = %d\n", sizeof(struct str));
printf("before f.a->s.\n");
if(f.a->s)
{
printf("before printf f.a->s.\n");
printf(f.a->s);
printf("before printf f.a->s.\n");
}
return 0;
}
编译,运行如下

本文探讨了在GCC环境下,零长度数组虽然不符合ISO C和C++标准,但因其在内存管理和访问速度上的优势而被预先支持。通过编译和汇编分析,展示了零长度数组与指针在内存占用和访问方式上的区别,强调了零长度数组在节省内存、简化内存释放和提高访问速度方面的价值。
最低0.47元/天 解锁文章
4934

被折叠的 条评论
为什么被折叠?



