C 无量纲数组字段,它的用途是什么?

C 无量纲数组字段,它的用途是什么?,c,C,sizeof(结构测试)返回0。所以,如果这是一个确切的别名 struct test{ unsigned long int asd[][3][6]; }; 这种字段声明是否有实际用途?你也可以考虑模板元编程的东西,这总是令人惊讶的。 < P>第一个例子演示了使用灵活的数组成员,C99的一个特性。但是,为了编译该代码段,您需要在结构中有另一个成员,即: struct test{ unsigned long int asd[0][3][6]; }; 在gcc上告诉您为什么size

sizeof(结构测试)
返回0。所以,如果这是一个确切的别名

struct test{
    unsigned long int asd[][3][6];
};

这种字段声明是否有实际用途?你也可以考虑模板元编程的东西,这总是令人惊讶的。

< P>第一个例子演示了使用灵活的数组成员,C99的一个特性。但是,为了编译该代码段,您需要在
结构中有另一个成员,即:

struct test{
    unsigned long int asd[0][3][6];
};
在gcc上告诉您为什么
sizeof
eva为零,以及普通数组的语法差异:

在ISO C90中,必须为内容指定长度1,这意味着 要么浪费空间,要么使malloc的参数复杂化

在ISOC99中,您将使用一个灵活的数组成员,它稍微 语法和语义不同:

  • 灵活数组成员写入为内容[],不带0
  • 灵活数组成员的类型不完整,因此可能无法应用sizeof运算符。作为原始实现的一个怪癖 对于零长度数组,sizeof的计算结果为零
  • 灵活数组成员只能作为非空结构的最后一个成员出现
  • 包含灵活数组成员的结构或包含此类结构的联合(可能是递归的)可能不是 数组的结构或元素的成员。(然而,这些用途 GCC允许作为扩展。)

第一个示例演示了灵活数组成员的使用,这是C99的一个特性。但是,为了编译该代码段,您需要在
结构中有另一个成员,即:

struct test{
    unsigned long int asd[0][3][6];
};
在gcc上告诉您为什么
sizeof
eva为零,以及普通数组的语法差异:

在ISO C90中,必须为内容指定长度1,这意味着 要么浪费空间,要么使malloc的参数复杂化

在ISOC99中,您将使用一个灵活的数组成员,它稍微 语法和语义不同:

  • 灵活数组成员写入为内容[],不带0
  • 灵活数组成员的类型不完整,因此可能无法应用sizeof运算符。作为原始实现的一个怪癖 对于零长度数组,sizeof的计算结果为零
  • 灵活数组成员只能作为非空结构的最后一个成员出现
  • 包含灵活数组成员的结构或包含此类结构的联合(可能是递归的)可能不是 数组的结构或元素的成员。(然而,这些用途 GCC允许作为扩展。)
它是一个“灵活的数组成员”,如(3.7MB PDF)第6.7.2.1节第16段所述

这是C99中的一个新特性;一些编译器(尤其是微软的)可能不支持它

请注意,灵活数组成员必须是结构的最后一个成员,并且不能是唯一的成员

它是对“struct hack”的替代品,如中的问题2.6所述。

它是一个“灵活数组成员”,如(3.7MB PDF)第6.7.2.1节第16段所述

这是C99中的一个新特性;一些编译器(尤其是微软的)可能不支持它

请注意,灵活数组成员必须是结构的最后一个成员,并且不能是唯一的成员


它是“结构黑客”的替代品,如中的问题2.6所述。

您可能希望在具有自定义内存分配器的系统中使用无量纲数组,因为您的内存数量有限。比如说,在嵌入式软件中

如果将结构定义为:

struct test{
    int a;
    unsigned long int asd[][3][6];
};
和内存池:

struct test
{
    int a;
    unsigned long int asd[][6][3];
};
您可以“分配”内存,并使用如下结构:

int *b = new unsigned long int[1000];
这种方法比生成指定维度的数组更灵活。当然,你可以使用这样的结构

test *t;
t = (test*)b;
t->asd[1][2][3] = 1;
但是您需要单独初始化指针,指针本身需要4个字节。
作为不使用指针的奖励,该结构被表示为一个线性内存块,可以按原样序列化。

您可能希望在具有自定义内存分配器的系统中使用无量纲数组,因为您的内存量有限。比如说,在嵌入式软件中

如果将结构定义为:

struct test{
    int a;
    unsigned long int asd[][3][6];
};
和内存池:

struct test
{
    int a;
    unsigned long int asd[][6][3];
};
您可以“分配”内存,并使用如下结构:

int *b = new unsigned long int[1000];
这种方法比生成指定维度的数组更灵活。当然,你可以使用这样的结构

test *t;
t = (test*)b;
t->asd[1][2][3] = 1;
但是您需要单独初始化指针,指针本身需要4个字节。
作为不使用指针的好处,结构被表示为线性内存块,可以按原样序列化。

“模板元编程”将是C++;你已经把你的问题标记为C++。我不知道第一个代码片段是有效的。C你使用什么编译器?一个不可变的数组是不完整的类型,因此它只能在某些上下文中使用。“模板元编程”是C++;您已将问题标记为C…我不知道第一个代码段是有效的C。您使用的编译器是什么?无量纲数组是不完整的类型,因此只能在某些上下文中使用。