C++中灵活数组结构使用

C99中结构中的最后一个元素是未知大小的数组称为灵活数据结构成员,但是结构中的灵活数组成员前面必须至少有一个其它成员.灵活数组成员也许结构中包含一个可变大小的数组.这种结构的sizeof返回大小不包含灵活数组的内存.包含灵活数组成员的结构使用malloc进行内存动态分配,并且分配的内存应该大于结构的大小,以适应灵活数组的预期大小. - 摘自《C语言大全》
一个使用灵活数组的示例如下:
#include <stdio.h>
// 定义一个灵活数组
typedef struct StType {
int count;
int item[0];
} StType;
int main()
{
printf(“sizeof(StType) = %d\n”, (int)sizeof(StType));
int val[4] = {3, 1, 2, 3};
StType *st = (StType*)val;
for (int i = 0; i < st->count; i++)
printf(“%d value =%d\n”, i, st->item[i]);
return 0;
}
编译后运行结果如下:
sizeof(StType) = 4
0 value = 1
1 value = 2
2 value = 3
从上面的结果可以看出item[0]并没有占用空间,这样我们可以使用malloc或者new来进行变长操作,如下所示.
StType*st=(StType*)newchar[sizeof(StType)+100*sizeof(int)];
st.count=100;
delete[]st;
上面的代码生产一个100个item的StType对象,可以使用delete[]st;释放分配的内存.
这种灵活数组成员(Fleiblearray member)在C89中是不支持的,C99作为一种特例加入到标准中,但是C99所支持的是不完整类型,而不是0数组,使用int item[0];定义是非法的,需要使用int item[]替代它,有些编译器可以使用是因为编译器把int item[0]作为非标准来支持.
注:在VC中编译会提示告警信息,如下:
warning C4200: nonstandard extension used :zero-sized array in struct/union
Cannot generate copy-ctor orcopy-assignment operator when UDT contains a zero-sized array
注意区分 C99新增的“可变长数组”:
C89 标准规定,数组大小必须是在编译时刻确定的;在C99 中,这个标准项被扩展,可以是运行时刻确定的值.也就是说,可变长数组和 C++ 本身没有关系,只要是支持 C99 的就可以使用可变长数组,包括支持 C99 的 C 编译器.
需要注意的是,可变长数组的维数在数组生存期内是不变的,也就是说,可变长数组不是动态的,可变的只是数组的大小.
有时候人们会考虑暂时不存在的兼容性问题,如果把程序移植到只有标准C89编译器的平台,那下面有几种可以替代的方法:

操作方法

  • 01

    1)方法1 struct header { size_t len; unsigned char data[1]; }; ptr = malloc(sizeof(struct header) + (n -1)); 但这种方法是否有效是有赖于实现的,这破坏了可移植性的规则.

  • 02

    2)方法2 struct header*my_header = malloc(offsetof(struct header, data) + n * sizeof(my_header->data)); 或者使用宏来简化代码: #define FLEXIBLE_SIZE SIZE_MAX // or whatever maximum length for an array #defineSIZEOF_FLEXIBLE(type, member, length) \ (offsetof(type,member) + (length) * sizeof((type*)0)->member[0]) 这种方法过于复杂,而且为了保持C89兼容,看起来没有什么特别的好处,你不需要一个完全的C99编译器就可以使用弹性数组成员.

  • 03

    3)方法3 使用指针,不要节约那一次间接引用,如果可移植性那么重要的话.

(0)

相关推荐

  • 怎么使用SSMS将SqlServer中的表结构和数据导出备份

    如果想要将SqlServer中的数据表结构及数据同时导出进行备份,该怎么操作呢?今天就跟大家介绍一下使用SSMS将SqlServer中的表结构和数据导出备份的具体操作步骤.1. 首先打开电脑上的SSM ...

  • java中的数组怎么学习

    java中的数组是存储多个变量元素的东西,这多个变量的数据类型要一致.数组可以存储基本数据类型,也可以存储引用数据类型.数组的格式:1.数据类型[]数组名             2.数据类型数组名[ ...

  • JavaScript中清空数组的三种方式

    JavaScript中清空数组的三种方式 方式1,splice 01 var ary = [1,2,3,4]; ary.splice(0,ary.length); console.log(ary);  ...

  • 在Word2007公式中添加运算符结构

    使用Word2007创建公式时,往往需要在公式中添加多种运算符.除了可以使用键盘和运算符面板输入运算符以外,用户还可以借助Word2007提供的公式结构添加运算符结构,具体操作步骤如下所述: 步骤/方 ...

  • 在Word2010公式中添加运算符结构

    使用Word2010创建公式时,往往需要在公式中添加多种运算符.除了可以使用键盘和运算符面板输入运算符以外,用户还可以借助Word2010提供的公式结构添加运算符结构,具体操作步骤如下所述: 步骤/方 ...

  • java中的选择结构

    java的基本选择结构,<在还没有知道java选择结构的时候,我们编写的程序总是从程序入口开始,顺序执行每一条语句直到执行完最后一条语句结束>,但是生活中经常需要进行条件判断,根据判断结果 ...

  • php 中如何数组添加数组

    数组,是编程语言中一个很常用的数据类型.在php中,也同样是如此,我们除了在数组中添加一般的数据类型,比如数字,字符串外,我们还可以在数组中添加一个数组,从而形成一个二维数组. 操作方法 01 首先我 ...

  • Excel中利用数组公式去除重复数值

    在一些时候,我们可能需要把一列数据中的不重复数据筛选出来,当然通过Excel自带的筛选功能可以实现,但不能实时同步提取数值,这时候就需要用到公式.在这里简单地分步骤介绍下如何利用数组公式提取不重复的数 ...

  • PL/SQL中如何导出表结构和表数据

    在数据库操作中,很多时候会发现数据库不兼容,但原来的数据库中又有很多数据,表结构也很复杂,这时候就会想到将这个表中的数据和表结构都移植到另一个数据库中,在PL/SQL的工具栏中,可以进行数据库表移植和 ...