struct MyData 
{
    int nLen;
    char data[0];
};

在结构中,data是一个数组名;但该数组没有元素;该数组的真实地址紧随结构体MyData之后,而这个地址就是结构体后面数据的地址(如果给这个结构体分配的内容大于这个结构体实际大小,后面多余的部分就是这个data的内容);这种声明方法可以巧妙的实现C语言里的数组扩展。

这表明data没有占用空间。data是一个数组名;该数组没有元素;该数组的真实地址紧随结构体Info之后;这种声明方法可以巧妙的实现C语言里的数组扩展。

实际用时采取这样:
         struct MyData *p = (struct MyData *)malloc(sizeof(struct MyData )+strlen(str))
         这样就可以通过p->data 来操作这个str。

示例:
#include <iostream>

using namespace std;

struct MyData 
{
    int nLen;
    char data[0];
};

int main()
{
    int nLen = 10;
    char str[10] = "123456789";

cout << "Size of MyData: " << sizeof(MyData) << endl;

MyData *myData = (MyData*)malloc(sizeof(MyData) + 10);
    memcpy(myData->data,  str, 10);

cout << "myData's Data is: " << myData->data << endl;

free(myData);

return 0;
}
         输出:
Size of MyData: 4
myData's Data is: 123456789

C99标准为了让这种用法合法化,专门定义了flexible array member,直接就是
struct Name { int size, char foo[] }; 不再写 char foo[0] 了。

它只能放在结构体末尾, 
是申明一个长度为0的数组(eg. char data[0] ;或 int data[0];都行) 
可以使得这个结构体是可变长的。

引申:

 #include <stdio.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
 #include <iostream>
 using namespace std;
 typedef struct test0{
     ];
     int b;
     char c;
 }sttest0;
 typedef struct test{
     ];
     ];
 }sttest;
 typedef struct test1{
     ];
     ];
 }sttest1;
 typedef struct test2{
     struct test tt;
     struct test1 tt1;
 }sttest2;

 int main()
 {
     ] = ";
     int len1 = sizeof(str);
     cout << len1 << endl;
     ] ="abcdefghij";
     int len2=sizeof(str2);
     cout << len2 << endl;
     printf("%lu %lu %lu\n", sizeof(sttest0), sizeof(sttest), sizeof(sttest1));
     cout << "Size of sttest2: " << sizeof(sttest2) << endl;
     sttest2 *tt2 = (sttest2*));

     memcpy(tt2->tt.a, str, len1);
     memcpy(tt2->tt1.a , str2, len2);

     //需要注意的是两者位置互换后的情况
 //    memcpy(tt2->tt1.a , str2, len2);
 //    memcpy(tt2->tt.a, str, len1);

     printf("#################value\n");
     printf("tt:%s\n%s\n", tt2->tt.a, tt2->tt.b);
     printf("tt1:%s\n%s\n", tt2->tt1.a, tt2->tt1.b);

     printf("#################address\n");
     printf("addr(tt2):%#x\n%#x\n", &tt2->tt, &tt2->tt1);
     printf("addr(tt):%#x\n%#x\n", &tt2->tt.a, &tt2->tt.b);
     printf("addr(tt1):%#x\n%#x\n", &tt2->tt1.a, &tt2->tt1.b);
     free(tt2);
     ;
 }

柔性数组 data[0]的更多相关文章

  1. C语言变长数组data[0]总结

    C语言变长数组data[0] 1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内 ...

  2. C语言变长数组data[0]

    1.前言 在刷题时遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data[0] ...

  3. C语言变长数组data[0]【总结】

    1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data ...

  4. c99柔性数组

    变长结构体 struct test { int nSize; char data[]; // 或者 char data[0];但建议使用 char data[]; 注意:c98 时不支持柔性数组,其仅 ...

  5. C/C++ 中的0长数组(柔性数组)

    转自C/C++ 中的0长数组(柔性数组) 在标准C和C++中0长数组如charArray[0]是不允许使用的,因为这从语义逻辑上看,是完全没有意义的.但是,GUN中却允许使用,而且,很多时候,应用在了 ...

  6. C语言0长度数组(柔性数组)

    0长度数组,又称为柔性数组(flexible array).通经常使用来实现变长数组.常见于TLV(type-length-value)的数据结构中. 在标准 C 和 C++ 中,不同意用 0 长度数 ...

  7. C语言变长数组 struct中char data[0]的用法

    版权声明:本文为博主原创文章,未经博主允许不得转载. 今天在看一段代码时出现了用结构体实现变长数组的写法,一开始因为忘记了这种技术,所以老觉得作者的源码有误,最后经过我深思之后,终于想起以前看过的用s ...

  8. (四)C语言柔性数组、指针赋值

    一.柔性数组 今天看了公司的代码,发现一个很奇怪的问题,后来自己写了类似代码,我先把代码贴出来吧. #include<stdio.h> #include<string.h> # ...

  9. C柔性数组

    柔性数组成员 柔性数组 .允许结构中包含一个大小可变的数组,sizeof返回的这种结构大小不包括柔性数组的内存. .包含柔性数组成员的结构要使用malloc()函数进行内存的动态分配.分配的内存大于结 ...

随机推荐

  1. Javascript高级程序设计——函数

    函数Function 通过函数封装多条语句,在任何地方执行.javascript函数不会重载,相同名字函数,名字属于后定义的函数通过function关键词声明. function functionNa ...

  2. CentOS-6.5安装zabbix2.4.4

    使用epel源  (检查网络连接是否正常)   //这里使用epel源 [root@localhost /]# wget -O /etc/yum.repos.d/CentOS-Base.repo ht ...

  3. CentOS-6.5-saltstack-安装

    官方网站:https://www.saltstack.com/ 官方文档   https://docs.saltstack.cn/contents.html GitHub:  https://gith ...

  4. 用jQuery编的一个分页小代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. iOS项目目录结构

    一. 目前最为流行的目录结构是: <先根据模块后根据功能> 的文件目录结构 优点: 模块分明, 并且开发和维护时方便查阅各个功能 缺点: 可能会出现模块内随意建立文件夹, 导致局部逻辑紊乱 ...

  6. 剑指Offer 从上往下打印二叉树(dfs)

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印.   思路: 用一个队列来辅助,先压入根节点,设置一个指针记录队列头位置,判断队头指针有没有孩子,有压入左右孩子,,,操作完一次,队头出 ...

  7. C++内存分配方式

    参考:http://www.cnblogs.com/daocaoren/archive/2011/06/29/2092957.html http://www.cnblogs.com/skydesign ...

  8. ndk学习19: 使用Eclipse调试so

    1.  设置调试选项 在AndroidManifest文件加入允许调试 android:debuggable="true"   此时编译项目会多出: 2.  配置调试代码 把需要调 ...

  9. midi格式

    http://www.ccarh.org/courses/253/handout/smf/

  10. sublime-text3设置浏览器预览html

    选择:Tools - Build System - New Build Syatem... 或者:工具 - 编译系统 - 新编译系统 然后粘贴代码 { "cmd": [" ...