柔性数组-读《深度探索C++对象模型》有感 (转载)
最近在看《深度探索C++对象模型》,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者。
原文如下:
例如,把单一元素的数组放在一个struct的尾端,于是每个struct objects可以拥有可变大小的数组。
code:
struct mumble {
//stuff
char pc[1]; };
//从档案或标准输入装置中取得一个字符串,然后为struct本身和该字符串配置足够的内存
struct mumble *pmumbl=(struct mumble*)malloc(sizeof(struct(mumble)))+strlen(string)+1;
strcpy(pmumbl->pc,string);
对于这段话,我刚开始的时候也是百思不得其解,经过一番研究之后,才知道这就是所谓的柔性数组用法。首先解释下柔性数组的概念:
柔性数组(Flexible Array)也叫伸缩性数组,其实就是变长数组,反映了C语言对精炼代码的极致追求。这种代码结构产生于对动态结构体的需求。比如我们需要在结构体中存放一个动态长度的字符串,这时候,柔性数组可以大显身手了。
C99使用不完整类型来实现柔性数组,标准形式如下:
struct MyStruct
{
int a;
double b;
char c[]; // or char c[0]; 也可以用其他数据类型;
};
c不占用MyStruct的空间,只是作为一个符号地址存在,而且必须是结构体的最后一个成员。
示例代码:
#include <iostream> #include <malloc.h> using namespace std; typedef struct MyStruct { int a; double b; char c[]; } ms,*pms; int main() { char c1[] = "Short string."; char c2[] = "This is a long string."; pms pms1 = (pms)malloc( sizeof(ms) + strlen(c1) + 1 ); if( NULL != pms1 ) { pms1->a = 1; pms1->b = 11; strcpy(pms1->c, c1); } cout<<"pms1: "<< pms1->a <<" "<<pms1->b <<" "<<pms1->c<< endl; pms pms2 = (pms)malloc( sizeof(ms) +strlen(c2) + 1 ); if( NULL != pms2 ) { pms2->a = 2; pms2->b = 22; strcpy(pms2->c, c2); } cout<<"pms2: "<<pms2->a <<" "<<pms2->b <<" "<<pms2->c<< endl; free( pms1 ); free( pms2 ); return 0; }
输出:
pms1: 1 11 Short string.
pms2: 2 22 This is a long string.
柔性数组-读《深度探索C++对象模型》有感 (转载)的更多相关文章
- 柔性数组-读《深度探索C++对象模型》有感
最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...
- [读书系列] 深度探索C++对象模型 初读
2012年底-2014年初这段时间主要用C++做手游开发,时隔3年,重新拿起<深度探索C++对象模型>这本书,感觉生疏了很多,如果按前阵子的生疏度来说,现在不借助Visual Studio ...
- 深度探索C++对象模型
深度探索C++对象模型 什么是C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各个支持的底层实现机制. 抽象性与实际性之间找出平衡点, 需要知识, 经验以及许多思考. 导读 这本书是C+ ...
- 《深度探索C++对象模型》读书笔记(一)
前言 今年中下旬就要找工作了,我计划从现在就开始准备一些面试中会问到的基础知识,包括C++.操作系统.计算机网络.算法和数据结构等.C++就先从这本<深度探索C++对象模型>开始.不同于& ...
- c++学习书籍推荐《深度探索C++对象模型》下载
百度云及其他网盘下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么这本<深度探索C++对象模型>正适合你 作者简介 ...
- 读书笔记《深度探索c++对象模型》 概述
<深度探索c++对象模型>这本书是我工作一段时间后想更深入了解C++的底层实现知识,如内存布局.模型.内存大小.继承.虚函数表等而阅读的:此外在很多面试或者工作中,对底层的知识的足够了解也 ...
- 拾遗与填坑《深度探索C++对象模型》3.3节
<深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...
- 拾遗与填坑《深度探索C++对象模型》3.2节
<深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...
- 深度探索C++对象模型——关于对象
引言 以前读<C++ Primer>的时候一直有一种感觉:该书虽然是C++入门书籍,初学者读之却觉晦涩,越往后读越是如此.等到稍加理解后再读该书,顿感醍醐灌顶,茅塞顿开.究其原因,在于原作 ...
随机推荐
- firefox HackBar组件模拟请求POST请求
组件下载地址:https://addons.mozilla.org/zh-CN/firefox/addon/hackbar/
- 例6.1:学生选课系统设计(界面设计、类图、数据库ER图)
- HDU 4800/zoj 3735 Josephina and RPG 2013 长沙现场赛J题
第一年参加现场赛,比赛的时候就A了这一道,基本全场都A的签到题竟然A不出来,结果题目重现的时候1A,好受打击 ORZ..... 题目链接:http://acm.hdu.edu.cn/showprobl ...
- 衬衫面料品牌:Alumo_衬衫_男装_男装:衬衫、法式衬衫、袖扣领带、西服西裤等男士正装服饰-仕族官网
衬衫面料品牌:Alumo_衬衫_男装_男装:衬衫.法式衬衫.袖扣领带.西服西裤等男士正装服饰-仕族官网 衬衫面料品牌:Alumo
- myeclipse 闪退解决方法
今天提交一个svn文件发生卡死,然后关闭myeclipse后发生,打开myeclipse出险闪退,摸索半天,发现: 只要修改下工作空间的名称,然后打开myeclipse重新导入即可,只是之前的配置都没 ...
- oracle权限问题
Assign the "Create global objects" user right to the non-Administrator account. 1. Click S ...
- solr5.3.1 集群服务搭建
转http://978538.blog.51cto.com/968538/1710442 一. 安装部署 zookeeper集群部署: 节点: 10.1.12.51:2181 node1 1 ...
- BIGINT UNSIGNED value is out of range in … 问题的解决方法
问题出现在CAST(value AS USIGNED)将字符串转换成数值的过程中,出现这个问题的原因是value对应的数值在BIGINT UNSIGNED 的范围内.可能的情况是value的值太大,超 ...
- Event 元标签中的代码提示问题
自定的事件可以利用Event元标签在支持该事件的类里面做绑定,绑定后FlashBuilder会有代码提示,以提示该类支持的事件类型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 ...
- [Javascript] Grouping and Nesting Console Log Output
Organize your log output by grouping your logs into collapsable hierarchies using console.group(). ; ...