什么是灵活阵列?

时间:2010-04-28 20:29:42

标签: language-agnostic

究竟什么是灵活阵列? 我找不到太多。

5 个答案:

答案 0 :(得分:8)

有几件事可以参考。我见过精确措辞的唯一地方就是C99。

灵活的数组成员是过去(通常)称为“struct hack”的官方C99名称。基本思想是你定义一个这样的结构:

struct x {
    int a; // whatever members you want here.
    size_t size;
    int x[]; // no size, last member only
};

主要(或专门)用于动态分配。如果要分配此类型的对象,可以为所需的任何数组大小分配足够的额外空间:

struct x *a = malloc(sizeof(struct x) + 20 * sizeof(int));
a->size = 20;

size成员并非绝对必要,但通常可以方便地跟踪为项目分配的大小。上面的那个有20个int的空间,但主要的一点是你可能有几个,每个都有自己的大小。

答案 1 :(得分:3)

没有灵活的数组这样的东西,但是有灵活的数组成员这样的东西。它用于提供对可变长度数据的访问,作为结构的成员。

来自http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=/com.ibm.xlcpp8a.doc/language/ref/strct.htm

  

灵活的阵列成员,是一个   C99功能,可以是一个元素   具有多个命名的结构   会员。灵活的阵列成员可以   用于访问可变长度   宾语。灵活的阵列成员必须   是这样一个的最后一个元素   结构,它有不完整的类型。

答案 2 :(得分:2)

灵活数组是一个数组,其索引边界在运行时确定,并且可能在数组的生命周期内发生变化。

Java数组非常灵活。例如,在Java中,您可以将一个数组分配给另一个数组:

int[] a1 = {1, 2, 3, 4};
int[] a2 = {1, 2, 3};
a1 = a2;

首先,a1的索引范围为0-3,a2的索引范围为0-2。

在赋值a1 = a2之后,a1指向索引范围为0-2的数组,因此a1的索引范围在a1的生命周期内变化。

答案 3 :(得分:1)

这是否描述了您的要求?这不是Sun的C编译器所独有的,但它是我发现的第一个清晰的概述:

Sun Studio 12 Update 1: C User's Guide: Flexible Array Members

答案 4 :(得分:0)

灵活的阵列成员是网络编程中不可或缺的工具。在网络编程中,您永远不会提前知道数据大小。

例如,出于某些原因,您正在编写代码以提供整个ROUTING TABLE。你永远不知道预先有多少路由,分配最大支持将严重妨碍你的代码。最安全的做法是声明灵活的阵列成员并烹饪所有数据并将其激活一次。