我最近读到在C中使用灵活的阵列成员是糟糕的软件工程实践.但是,该声明没有任何论据支持.这是公认的事实吗?
(灵活的数组成员是C99中引入的C特性,其中可以将最后一个元素声明为未指定大小的数组.例如:)
struct header {
size_t len;
unsigned char data[];
};
Run Code Online (Sandbox Code Playgroud) 我发现在数组的声明中,我们不能像这样指定它的大小
int a[0];
Run Code Online (Sandbox Code Playgroud)
我知道,C++中的空大小数组是非法的,但在我的代码中,空大小的数组编译器允许并给出输出.
我的代码在这里:
#include <iostream>
using namespace std;
int main()
{
int a[0];
a[0] = 10;
a[1] = 20;
cout<<a[0]<<endl;
cout<<a[1]<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
10
20
Run Code Online (Sandbox Code Playgroud)
在线编译链接:http://code.geeksforgeeks.org/TteOmO
所以,我的问题是,为什么int a[0]允许GCC编译器?
我偶然发现下面的代码令我感到困惑:
union
{
struct
{
uint32_t Id;
uint8_t a_data[];
}vendor;
uint8_t avp[0];
}data;
Run Code Online (Sandbox Code Playgroud)
这与g ++ 7.2.1编译良好,但我无法理解为什么.在定义a_data时如何不需要提供大小?如何将avp的大小调整为零?