弹性数组

看这个结构体的定义:
typedef struct st_type
{
     int nCnt;
     int item[0];
}type_a;
(有些编译器会报错无法编译可以改成:)
typedef struct st_type
{
     int nCnt;
     int item[];
}type_a;
    这样我们就可以定义一个可变长的结构,用sizeof(type_a)得到的只有4,就是sizeof(nCnt)=sizeof(int)那个0个元素的数组没有占用空间,而后我们可以进行变长操作了。
        C语言版:        type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));
        C++语言版:        type_a *p = (type_a*)new char[sizeof(type_a)+100*sizeof(int)];
    这样我们就产生了一个长为100的type_a类型的东西用p->item[n]就能简单地访问可变长元素,原理十分简单,分配了比sizeof(type_a)多的内存后int item[];就有了其意义了,它指向的是int nCnt;后面的内容,是没有内存需要的,而在分配时多分配的内存就可以由其来操控,是个十分好用的技巧。
而释放同样简单:
        C语言版:free(p);
        C++语言版:delete []p;
    这个被称为灵活/弹性数组成员(fleible array member)C89不支持这种东西,C99把它作为一种特例加入了标准。但是,C99所支持的是incomplete type,而不是zero array,形同int item[0];这种形式是非法的,C99支持的形式是形同int item[];只不过有些编译器把int item[0];作为非标准扩展来支持,而且在C99发布之前已经有了这种非标准扩展了,C99发布之后,有些编译器把两者合而为一。


    下面是C99中的相关内容:
6.7.2.1 Structure and union specifiers
    As a special case, the last element of a structure with more than one named member may have an incomplete array type; this is called a flexible array member. With two exceptions, the flexible array member is ignored. First, the size of the structure shall be equal to the offset of the last element of an otherwise identical structure that replaces the flexible array member with an array of unspecified length.106) Second, when a . (or ->) operator has a left operand that is (a pointer to) a structure with a flexible array member and the right operand names that member, it behaves as if that member were replaced with the longest array (with the same element type) that would not make the structure larger than the object being accessed; the offset of the array shall remain that of the flexible array member, even if this would differ from that of the replacement array. If this array would have no elements, it behaves as if it had one element but the behavior is undefined if any attempt is made to access that element or to generate a pointer one past it.

 

注意区分 C99新增的“可变长数组”:
C89 标准规定,数组大小必须是在编译时刻确定的;在C99 中,这个标准项被扩展,可以是运行时刻确定的值。也就是说, 可变长数组和 C++ 本身没有关系,只要是支持 C99 的就可以使用可变长数组,包括支持 C99 的 C 编译器。

需要注意的是,可变长数组的维数在数组生存期内是不变的,也就是说,可变长数组不是动态的,可变的只是数组的大小。

引进这一特性的目的是为了支持数值处理。

转载于:https://www.cnblogs.com/ysdu/p/6210872.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是Akka?

在深入研究什么是Akka之前,让我们退后一步来了解并发编程的概念在应用程序开发世界中是如何演变的。 应用程序已经从大型的整体程序演变为面向对象的模型。 随着Java EE和Spring框架的出现,应用程序设计演变为更多的基于流程或任务的设计模型。 EJB或Poj…

apache2服务器搭建心得

网站的配置文件在/etc/apache2/sites-avalible中,每个文件对应一个虚拟站点,但需要在/etc/apache2/sites-enabled中创建软链接到sites-avalible中对应的文件。 起初我在sites-avalible中创建了两个站点,一个netaddi.com,一个test.…

has_a php,PHP has encountered a Stack overflow问题解决方法

昨晚将一个disucz论坛进行转移后,发现打开的页面上回多一个PHP has encountered a Stack overflow 这个提示错误,进过翻译为“PHP遇到堆栈溢出”。我就感觉奇怪了,新站没人访问的,怎么可能会溢出。 好吧去discuz官方论坛找找解决方…

解决ueditor jquery javascript 取值问题

代码如下: var content UE.getEditor(myEditor).getContent();myEditor是ueditor 的名称name。代码如下: <textarea name"myEditor" id"myEditor"></textarea><script type"text/javascript">var editor new UE.ui.Editor()…

异常处理准则和最佳实践

让我们回顾一些从对象设计总结的基本异常设计准则&#xff1a;角色&#xff0c;职责和协作&#xff08;Rebecca Wirfs-Brock和Alan McKean&#xff0c;Addison-Wesley&#xff0c;2003年&#xff09;。 不要尝试处理编码错误。 除非在错误情况下要求您的软件采取特殊措施&…

HDU 5225 枚举

题目链接&#xff1a; hdu:http://acm.hdu.edu.cn/showproblem.php?pid5225 bc(中文):http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid580&pid1002 题解&#xff1a; 数组a保存输入 考虑当前位i&#xff0c;对于1<j<i&#xff0c;使得x[j]a[…

河南上oracle客户,解决Oracle监听服务报错

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼如果只是本机的访问 sqlplus system/manager这样是没有问题的。但是如果使用 sqlplus system/managerorcl的时候却会报ora-12514的错误。解决方法&#xff1a;1. 打开D:\oracle\product\10.2.0\db_1/network/admin/listener.ora文件…

【BZOJ2073】[POI2004]PRZ 状压DP

【BZOJ2073】[POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍在桥上的人都不能超过一定的限制. 所以这只队伍过桥时只能分批过,当一组全部过去时,下一组才能接着过. 队…

运行时vs编译时类路径

这确实应该是一个简单的区别&#xff0c;但是我一直在回答有关Stackoverflow的许多类似问题&#xff0c;并且经常有人误解此事。 那么&#xff0c;什么是类路径&#xff1f; 应用程序所需的一组所有类&#xff08;以及带有类的jar&#xff09;的集合。 但是有两个或实际上三个不…

Unity3d 实现顶点动画

在今年GDC上发现一个非常有趣的演讲&#xff0c;叫做Animating With Math&#xff0c;遂实现之&#xff0c;是讲述顶点shader动画的&#xff0c;举了几个经典的例子&#xff0c;但是讲者并没有给代码&#xff0c;而是像虚幻引擎那样的节点&#xff0c;这样更加清楚明了之前博主…

php codeigniter ext,php – 私有服务器上CodeIgniter不正确的系统路径

上传到服务器的codeigniter项目给我以下错误.Your system folder path does not appear to be set correctly. Pleaseopen the following file and correct this: index.php它在当地运作良好在000webhost.com托管.When uploaded to private server of parallels it gives the a…

对于表单的一些想法

表单 <form id"" name"" method"get/post" action""> 其中get提交长度有限制&#xff0c;并且编码后内容在地址栏可见&#xff0c;post与其相反。 </form> 文本输入 文本框<input type"text" id""…

REST端点,可使用Apache Camel进行集成

REST是一种用于组织资源的体系结构样式&#xff0c;当应用于基于HTTP的服务时&#xff0c;REST可以构建无状态的&#xff0c;解耦的&#xff0c;可伸缩的服务。 HTTP方法&#xff0c;HTTP标头和mime类型都允许开发人员实现REST样式。 诸如Jersey和Fuse Services Framework&…

Appium+Python API相关知识了解

首先&#xff0c;要先了解&#xff0c;官方Appium API // https://testerhome.com/topics/3144 刚开始的时候&#xff0c;没有看官方API&#xff0c;然后在网上瞎找学习资料&#xff0c;发现python相关的很少&#xff0c;看了API才知道&#xff0c;就是selenium webdriver的定位…

JSON用于多态Java对象序列化

长期以来&#xff0c;JSON已成为客户端和服务器之间各种数据序列化的事实上的标准。 除其他外&#xff0c;它的优势是简单和易于阅读。 但是&#xff0c;简单起了一些限制&#xff0c;我今天要谈的其中一个限制是&#xff1a;存储和检索多态Java对象。 让我们从一个简单的问题开…

linux 命令分类,常用linux 命令分类整理(篇一)

工作中接触linux时间也不算短了&#xff0c;不同于Windows的图形化操作&#xff0c;使用linux几乎百分之九十五的情况是在命令行下过日子&#xff0c;过去的两年里&#xff0c;零零碎碎整理过一版自己工作中涉及到和学习过的命令(不过常用的只有三十个左右)&#xff0c;思前想后…

考研复习策略

考研复习是一个不容易的过程&#xff0c;有好的策略事半功倍&#xff0c;以我曾经失败的教训和成功的实践给出了我认为不错的策略&#xff0c;只要能做到&#xff0c;我相信一定能考研成功。 院校选择&#xff1a;985院校在选择考研院校是有优势的&#xff0c;院校考虑的因素有…

js中的this指针(二)

在 js 中声明并定义一个函数后&#xff0c;除了定义时传入的形式参数&#xff0c;函数还会接收到 2 个附加的参数&#xff1a;this 和 arguments。 this 指针的值取决于调用时的模式。 当这个函数被保存为对象的一个属性时&#xff0c;它被称为“方法”。当一个方法被调用时&am…

使用AspectJ和Spring简化了AOP

我最近开始研究面向方面的编程&#xff08;AOP&#xff09;&#xff0c;至少可以说使我兴奋。 当然我很熟悉它&#xff0c;因为我看到它在Spring中用于事务管理&#xff0c;但是我从未深入研究它。 在本文中&#xff0c;我想展示通过AspectJ可以快速掌握AOP和Spring。 本文中的…

第一冲刺阶段 工作总结 04

1、昨天我继续我的任务&#xff0c;连接数据库。 2、今天打算继续做数据库的连接。 3、遇到的问题&#xff1a;昨天在数据库连接时&#xff0c;老是连接不上&#xff0c;显示错误&#xff0c;所以今天打算接着弄。转载于:https://www.cnblogs.com/zz0906/p/5422510.html