柔性数组 data[0]
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]的更多相关文章
- C语言变长数组data[0]总结
C语言变长数组data[0] 1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内 ...
- C语言变长数组data[0]
1.前言 在刷题时遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data[0] ...
- C语言变长数组data[0]【总结】
1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data ...
- c99柔性数组
变长结构体 struct test { int nSize; char data[]; // 或者 char data[0];但建议使用 char data[]; 注意:c98 时不支持柔性数组,其仅 ...
- C/C++ 中的0长数组(柔性数组)
转自C/C++ 中的0长数组(柔性数组) 在标准C和C++中0长数组如charArray[0]是不允许使用的,因为这从语义逻辑上看,是完全没有意义的.但是,GUN中却允许使用,而且,很多时候,应用在了 ...
- C语言0长度数组(柔性数组)
0长度数组,又称为柔性数组(flexible array).通经常使用来实现变长数组.常见于TLV(type-length-value)的数据结构中. 在标准 C 和 C++ 中,不同意用 0 长度数 ...
- C语言变长数组 struct中char data[0]的用法
版权声明:本文为博主原创文章,未经博主允许不得转载. 今天在看一段代码时出现了用结构体实现变长数组的写法,一开始因为忘记了这种技术,所以老觉得作者的源码有误,最后经过我深思之后,终于想起以前看过的用s ...
- (四)C语言柔性数组、指针赋值
一.柔性数组 今天看了公司的代码,发现一个很奇怪的问题,后来自己写了类似代码,我先把代码贴出来吧. #include<stdio.h> #include<string.h> # ...
- C柔性数组
柔性数组成员 柔性数组 .允许结构中包含一个大小可变的数组,sizeof返回的这种结构大小不包括柔性数组的内存. .包含柔性数组成员的结构要使用malloc()函数进行内存的动态分配.分配的内存大于结 ...
随机推荐
- Javascript高级程序设计——函数
函数Function 通过函数封装多条语句,在任何地方执行.javascript函数不会重载,相同名字函数,名字属于后定义的函数通过function关键词声明. function functionNa ...
- CentOS-6.5安装zabbix2.4.4
使用epel源 (检查网络连接是否正常) //这里使用epel源 [root@localhost /]# wget -O /etc/yum.repos.d/CentOS-Base.repo ht ...
- CentOS-6.5-saltstack-安装
官方网站:https://www.saltstack.com/ 官方文档 https://docs.saltstack.cn/contents.html GitHub: https://gith ...
- 用jQuery编的一个分页小代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- iOS项目目录结构
一. 目前最为流行的目录结构是: <先根据模块后根据功能> 的文件目录结构 优点: 模块分明, 并且开发和维护时方便查阅各个功能 缺点: 可能会出现模块内随意建立文件夹, 导致局部逻辑紊乱 ...
- 剑指Offer 从上往下打印二叉树(dfs)
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 用一个队列来辅助,先压入根节点,设置一个指针记录队列头位置,判断队头指针有没有孩子,有压入左右孩子,,,操作完一次,队头出 ...
- C++内存分配方式
参考:http://www.cnblogs.com/daocaoren/archive/2011/06/29/2092957.html http://www.cnblogs.com/skydesign ...
- ndk学习19: 使用Eclipse调试so
1. 设置调试选项 在AndroidManifest文件加入允许调试 android:debuggable="true" 此时编译项目会多出: 2. 配置调试代码 把需要调 ...
- midi格式
http://www.ccarh.org/courses/253/handout/smf/
- sublime-text3设置浏览器预览html
选择:Tools - Build System - New Build Syatem... 或者:工具 - 编译系统 - 新编译系统 然后粘贴代码 { "cmd": [" ...