博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
柔性数组-读《深度探索C++对象模型》有感
阅读量:4596 次
发布时间:2019-06-09

本文共 1669 字,大约阅读时间需要 5 分钟。

最近在看《深度探索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 
#include
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 <<" "<
b <<" "<
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: "<
a <<" "<
b <<" "<
c<< endl; free( pms1 ); free( pms2 ); return 0;}

  输出:

    pms1: 1 11 Short string.

    pms2: 2 22 This is a long string.

  

转载于:https://www.cnblogs.com/nchxmoon/p/3145480.html

你可能感兴趣的文章
JDBC_基础6步骤- 及优化
查看>>
WCM重启报数据库启动错误
查看>>
totoise svn误将桌面作为checkout路径,界面一堆?
查看>>
java写"\n"写入到txt文本用记事本打开出现黑框解决方案
查看>>
第三章例3-7
查看>>
心得五
查看>>
react antD moment
查看>>
MySql创建指定字符集的数据库
查看>>
bzoj 3172 AC自动机
查看>>
rabbitmq
查看>>
解决Latex中Itemize距离过大的问题
查看>>
1打印沙漏
查看>>
LeetCode | Rotate List
查看>>
CodeForces - 455D
查看>>
【转】Django模糊查询
查看>>
Bugtags 创业一年总结
查看>>
UML建模原理
查看>>
[BZOJ 1083] [SCOI2005] 繁忙的都市
查看>>
图解C#的值类型,引用类型,栈,堆,ref,out
查看>>
spring5.0版本-AOP-如何实现拦截器链式调用(责任链模式)
查看>>