最近在看《深度探索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) + );
if( NULL != pms1 )
{
pms1->a = ;
pms1->b = ;
strcpy(pms1->c, c1);
} cout<<"pms1: "<< pms1->a
<<" "<<pms1->b
<<" "<<pms1->c<< endl; pms pms2 = (pms)malloc( sizeof(ms) +strlen(c2) + );
if( NULL != pms2 )
{
pms2->a = ;
pms2->b = ;
strcpy(pms2->c, c2);
} cout<<"pms2: "<<pms2->a
<<" "<<pms2->b
<<" "<<pms2->c<< endl; free( pms1 );
free( pms2 ); return ;
}

  输出:

    pms1: 1 11 Short string.
    pms2: 2 22 This is a long string.

  

柔性数组-读《深度探索C++对象模型》有感的更多相关文章

  1. 柔性数组-读《深度探索C++对象模型》有感 (转载)

    最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...

  2. [读书系列] 深度探索C++对象模型 初读

    2012年底-2014年初这段时间主要用C++做手游开发,时隔3年,重新拿起<深度探索C++对象模型>这本书,感觉生疏了很多,如果按前阵子的生疏度来说,现在不借助Visual Studio ...

  3. 深度探索C++对象模型

    深度探索C++对象模型 什么是C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各个支持的底层实现机制. 抽象性与实际性之间找出平衡点, 需要知识, 经验以及许多思考. 导读 这本书是C+ ...

  4. 《深度探索C++对象模型》读书笔记(一)

    前言 今年中下旬就要找工作了,我计划从现在就开始准备一些面试中会问到的基础知识,包括C++.操作系统.计算机网络.算法和数据结构等.C++就先从这本<深度探索C++对象模型>开始.不同于& ...

  5. c++学习书籍推荐《深度探索C++对象模型》下载

    百度云及其他网盘下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么这本<深度探索C++对象模型>正适合你 作者简介 ...

  6. 读书笔记《深度探索c++对象模型》 概述

    <深度探索c++对象模型>这本书是我工作一段时间后想更深入了解C++的底层实现知识,如内存布局.模型.内存大小.继承.虚函数表等而阅读的:此外在很多面试或者工作中,对底层的知识的足够了解也 ...

  7. 拾遗与填坑《深度探索C++对象模型》3.3节

    <深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...

  8. 拾遗与填坑《深度探索C++对象模型》3.2节

    <深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...

  9. 深度探索C++对象模型——关于对象

    引言 以前读<C++ Primer>的时候一直有一种感觉:该书虽然是C++入门书籍,初学者读之却觉晦涩,越往后读越是如此.等到稍加理解后再读该书,顿感醍醐灌顶,茅塞顿开.究其原因,在于原作 ...

随机推荐

  1. thinkphp第二天

    1.使用print_r();打印数组的时候最好使用<pre>标签,可以是数组表现的更加直观. pre 元素可定义预格式化的文本.被包围在 pre 元素中的文本通常会保留空格和换行符.而文本 ...

  2. AutoCAD 2014简体中文版官方正式版x86 x64下载,带注册机,永久免费使用

    注册机使用说明:会有部分杀毒软件报病毒,请无视.操作步骤:1.安装Autodesk AutoCAD 20142.使用以下序列号666-69696969安装.3.产品密码为001F14.安装完成后,启动 ...

  3. DELPHI编写服务程序总结

    DELPHI编写服务程序总结 一.服务程序和桌面程序的区别 Windows 2000/XP/2003等支持一种叫做“系统服务程序”的进程,系统服务和桌面程序的区别是:系统服务不用登陆系统即可运行:系统 ...

  4. win7 x64 驱动

    原文:win7 x64 驱动 从x86转x64 1.编译环境要为x64 2.修改inf文件 [Manufacturer] %MfgName%=Mfg0,NT,NTia64,NTAMD64 [Mfg0] ...

  5. cocos2dx进阶学习之CCSprite

    继承关系 CCSprite -> CCNodeRGBA       ->   CCNode, CCRGBAProtocol CCTextureProtocol 从继承关系可以看出,CCSp ...

  6. Linux基本配置和管理 1---- Linux网络基本配置

    1 IP编址 1 IP编址是一个双层的编址方案,一个IP编址标识一个主机(或一个网卡接口) 2 现在应用最为广泛的是ipv4,已经开始逐步香ipv6切换 3 ipv4地址为32位,ipv6为128位 ...

  7. Javabyte[]数组和十六进制String之间的转换Util------包含案例和代码

    Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示(23 + 22 + 21 + 20 = 15),所以我们就可以把每个byte转换成两个相应的16进制字符, ...

  8. Treasure Exploration(二分最大匹配+floyd)

    Treasure Exploration Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 7455   Accepted: 3 ...

  9. 2014 北京邀请赛ABDHJ题解

    A. A Matrix 点击打开链接 构造,结论是从第一行開始往下产生一条曲线,使得这条区间最长且从上到下递减, #include <cstdio> #include <cstrin ...

  10. [POJ 2184]--Cow Exhibition(0-1背包变形)

    题目链接:http://poj.org/problem?id=2184 Cow Exhibition Time Limit: 1000MS   Memory Limit: 65536K Total S ...