@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]用法总结的更多相关文章

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

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

  2. [C/C++] char data[0](柔性数组)

    转自:http://blog.csdn.net/yby4769250/article/details/7294696 在标准C和C++中0长数组如charArray[0]是不允许使用的,因为这从语义逻 ...

  3. 柔性数组 data[0]

    struct MyData {    int nLen;    char data[0];}; 在结构中,data是一个数组名:但该数组没有元素:该数组的真实地址紧随结构体MyData之后,而这个地址 ...

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

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

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

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

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

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

  7. C中char类型的用法

    代码 /* char类型的用法 */ #include <stdio.h> main(int argc, char *argv[]) { /* 声明字符变量c1 */ char c1 = ...

  8. Vue1.0用法详解

    Vue.js 不支持 IE8 及其以下版本,因为 Vue.js 使用了 IE8 不能实现的 ECMAScript 5 特性. 开发环境部署 可参考使用 vue+webpack. 基本用法 1 2 3 ...

  9. mysql导入数据load data infile用法

    mysql导入数据load data infile用法 基本语法: load data [low_priority] [local] infile 'file_name txt' [replace | ...

随机推荐

  1. markdown居中对齐,左对齐,右对齐

    Markdown语法本身没有居中,但Markdown中支持基本的HTMl语法,可以使用HTML语法. 居中: <center>居中</center> 左对齐: <p al ...

  2. Java基础——接口和抽象类

    接口(interface) 什么是接口? 接口时抽象方法的合集.接口不可以被直接被实例化. 为什么要使用接口? 为了扩展.Java不支持多继承,但是通过接口就可以实现“多继承” 制定规则.接口就是规则 ...

  3. js 获取xxxx-xx-xx时间格式

    function getdate() { var now = new Date(), y = now.getFullYear(), m = now.getMonth() + 1, d = now.ge ...

  4. 冲刺Noip2017模拟赛7 解题报告——五十岚芒果酱

    1.二叉树(binary) .二叉树 (binary.cpp/c/pas) [问题描述] 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: ()若左子树不空,则左子树上所有结点的值均小于它的根结 ...

  5. c# 所有类型都是从object继承,那么值类型默认也有装箱吗?

    我们知道,c#所有类型都是从System.Object继承,int等值类型也逃脱不了这种命运,那难道值类型默认有装箱操作吗?答案是否,在CLR via这本书中有简短的解释说明: 1.值类型从Syste ...

  6. Docker 安装 PHP

    安装 PHP 镜像 查找Docker Hub上的php镜像 docker search php 这里我们拉取官方的镜像,标签为5.6-fpm docker pull php:5.6-fpm Nginx ...

  7. 【转帖】Linux的NUMA机制

    Linux的NUMA机制 http://www.litrin.net/2014/06/18/linux的numa机制/ NUMA(Non-Uniform Memory Access)字面直译为“非一致 ...

  8. docker中启动2个mysql实列

    一.mac环境安装docker容器 在docker官网中下载docker容器,地址:https://www.docker.com/products/docker-desktop 具体安装教程及设置网络 ...

  9. 小菜鸟之shell

    Linux shell编程 目录 什么是Shell 1 Shell脚本的执行方式 1 第一种:输入脚本的绝对路径或相对路径 1 第二种:bash或sh +脚本 1 Shell中的变量 2 定义变量 2 ...

  10. 小菜鸟之oracle触发器

    1.触发器说明 触发器是一种在事件发生时隐式地自动执行的PL/SQL块,不能接受参数,不能被显式调用 2.触发器类型 根据触发器所创建的语句及所影响的对象的不同,将触发器分为以下3类 (1)DML触发 ...