【转】char data[0]用法总结
@2019-07-31
struct MyData
{
int nLen;
char data[];
};
开始没有理解红色部分的内容,上网搜索下,发现用处很大,记录下来。
在结构中,data是一个数组名;但该数组没有元素;该数组的真实地址紧随结构体MyData之后,而这个地址就是结构体后面数据的地址(如果给这个结构体分配的内容大于这个结构体实际大小,后面多余的部分就是这个data的内容);这种声明方法可以巧妙的实现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[];
}; int main()
{
int nLen = ;
char str[] = ""; cout << "Size of MyData: " << sizeof(MyData) << endl; MyData *myData = (MyData*)malloc(sizeof(MyData) + );
memcpy(myData->data, str, ); cout << "myData's Data is: " << myData->data << endl; free(myData); return ;
}
输出:
Size of MyData: 4
myData's Data is: 123456789
由于数组没有元素,该数组在该结构体中分配占用空间,所以sizeof(struct Mydata) = 4。
malloc申请的是14个字节的连续空间,它返回一个指针指向这14个字节,强制转换成struct INFO的时候,前面4个字节被认为是Mydata结构,后面的部分拷贝了“123456789”的内容。
在读程序中经常会看到这样的定义char data[0],这是一个什么样的用法,有什么好处,在哪些地方用到?
本文的主要目的就是阐明这个定义的作用,以及适用范围,这需要对指针的概念和操作系统的内存模型有一个情形的认识。
首先看一段程序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct _Info
{
int i;
char data[];
}Info;
int main(int argc, char* argv[])
{
printf("%d/n",sizeof(Info));
return ;
}
程序的执行结果是:4。
整数i就占了4个字节,这表明data没有占用空间。data是一个数组名;该数组没有元素;该数组的真实地址紧随结构体Info之后;这种声明方法可以巧妙的实现C语言里的数组扩展。
记住上面的结构体不同于:
typedef struct _Info
{
int i;
char* data;
}Info;
这个结构体占用8个字节的空间,因为指针类型要占用4个字节的空间。
再看一个例子:
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct _Info
{
int i; char data[]; }Info; int main(int argc, char* argv[])
{ char buf[] = ""; void* p = NULL; printf("%d\n",sizeof(Info)); Info* info = (Info*)malloc(sizeof(Info) + ); p = (void*)info->data; printf("addr of info is %p. addr of data is %p ./n", info, p); strcpy((char*)p, buf); printf("%s\n", (char*)p); return ;
}
程序的执行结果:
4
addr of info is 0x188b020. addr of data is 0x188b024 .
123456789
可知,data的地址是紧随结构体之后的。
【来源】
【转】char data[0]用法总结的更多相关文章
- C语言变长数组 struct中char data[0]的用法
版权声明:本文为博主原创文章,未经博主允许不得转载. 今天在看一段代码时出现了用结构体实现变长数组的写法,一开始因为忘记了这种技术,所以老觉得作者的源码有误,最后经过我深思之后,终于想起以前看过的用s ...
- [C/C++] char data[0](柔性数组)
转自:http://blog.csdn.net/yby4769250/article/details/7294696 在标准C和C++中0长数组如charArray[0]是不允许使用的,因为这从语义逻 ...
- 柔性数组 data[0]
struct MyData { int nLen; char data[0];}; 在结构中,data是一个数组名:但该数组没有元素:该数组的真实地址紧随结构体MyData之后,而这个地址 ...
- C语言变长数组data[0]
1.前言 在刷题时遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data[0] ...
- C语言变长数组data[0]【总结】
1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内核中,结构体中经常用到data ...
- C语言变长数组data[0]总结
C语言变长数组data[0] 1.前言 今天在看代码中遇到一个结构中包含char data[0],第一次见到时感觉很奇怪,数组的长度怎么可以为零呢?于是上网搜索一下这样的用法的目的,发现在linux内 ...
- C中char类型的用法
代码 /* char类型的用法 */ #include <stdio.h> main(int argc, char *argv[]) { /* 声明字符变量c1 */ char c1 = ...
- Vue1.0用法详解
Vue.js 不支持 IE8 及其以下版本,因为 Vue.js 使用了 IE8 不能实现的 ECMAScript 5 特性. 开发环境部署 可参考使用 vue+webpack. 基本用法 1 2 3 ...
- mysql导入数据load data infile用法
mysql导入数据load data infile用法 基本语法: load data [low_priority] [local] infile 'file_name txt' [replace | ...
随机推荐
- Java使用Java OCR API进行验证码识别
Maven坐标: <!-- https://mvnrepository.com/artifact/com.asprise.ocr/java-ocr-api --> <dependen ...
- Jmeter 逻辑控制器 之 Switch Controller
一.认识 Switch Controller Switch Controller:开关控制器,通过其下样例顺序数值或名称 控制执行某一个样例 二.通过样例顺序数值控制执行样例 三.通过样例名称控制 ...
- 使用微软的WinAppDriver进行Windows客户端自动化测试
一.WinAppDriver简介: 参见:https://github.com/microsoft/WinAppDriver Windows Application Driver(WinAppDriv ...
- git 命令常用笔记
1. 全局操作 git --version //git 机器上是否存在 git init --bare project.git //服务端:初始化一个新的仓库 chown -R zhangsan:zh ...
- CentOS修改主机名称
centos6 或者centos7修改主机名称的方式 centos6 修改主机名 [root@centos6 ~]$ hostname # 查看当前的hostnmae centos6.com [roo ...
- 安装mysqlmysql-5.7.24-linux-glibc2.12-x86_64
1.下载mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz(/opt目录) 2.tar -zxvf mysql-5.7.24-linux-glibc2.12-x86_ ...
- 获取Xshell Xftp等官网下载地址
1. 首先还是得填写邮箱获取试用链接地址,例如我这次获取的是: https://cdn.netsarang.net/c5711331/Xshell-6.0.0175.exe 关键需要记下 c57113 ...
- VUE缓存:keep-alive
VUE缓存:动态keep-alive:https://www.jianshu.com/p/11f7dbc07ad3 keep-alive include和exclude无效问题:https://blo ...
- vue 解决jsonp跨域
在Vue中使用jsonp 参考链接:https://blog.csdn.net/m0_38134431/article/details/87930647 在vue中使用vue-jsonp 参考链接:h ...
- java中volatile关键字的作用
一.内存模型的相关概念 大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入.由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存 ...