#include <stdio.h>
#include <stdlib.h>
#include <string.h> typedef struct Variable_length_array
{
size_t len;
char Arrary[0];
}CString; int main(void)
{ printf("In stack\n");
CString arr;
printf("&a : %p\n", &arr);
printf("&a.len : %p\n", &(arr.len));
printf("&aArrary : %p\n", &(arr.Arrary));
printf("sizeof(arr) : %lu\n", sizeof(arr));
printf("sizeof(CString) : %lu\n", sizeof(CString)); char pStr[] = "Variable_length_array"; size_t len = strlen(pStr);
CString *p = (CString*)malloc(sizeof(CString) + len);
p->len = len;
strcpy(p->Arrary,pStr); printf("\nIn heap\n");
printf("&p : %p\n",p);
printf("&p->len : %p\n",&(p->len));
printf("&p->Array : %p\n", &(p->Arrary)); printf("sizeof(*p) : %lu\n", sizeof(*p));
printf("sizeof(CString) : %lu\n", sizeof(CString)); printf("\nTest p + sizeof(CString)\n");
printf("sizeof(CString*) : %lu\n", sizeof(CString*));
printf("p+sizeof(CString) : %p\n", p+sizeof(CString));
printf("(char*)p+sizeof(CString) : %p\n", ((char*)p+sizeof(CString))); printf("\nTest Get the struct data\n");
char szBuffer[64] = {0};
// memcpy(szBuffer, p->Arrary, p->len); //ok
// memcpy(szBuffer, p+sizeof(CString), p->len); //未到达要求
memcpy(szBuffer, (const void*)p+sizeof(CString), p->len); //ok
// memcpy(szBuffer, (const void*)p+sizeof(CString), strlen((const void*)p+sizeof(CString))); //ok
printf("szBuffer : %s\n",szBuffer); free(p); return 0;
}

根据结果可以得出的信息

  1. 结构体的地址和结构体中第一个元素的地址是相同的
  2. Array在结构体中“不占空间”

实现的前提:

数组必须在结构体的最后,因为malloc的是整个结构体,如果数组不在最后,申请的空间会覆盖后面元素的空间

C语言变长数组的更多相关文章

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

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

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

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

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

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

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

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

  5. c语言,变长数组

    下面这个结构体,可以在malloc的时候指定数据data的长度,这样的形式就是变长数组:typedef struct{ int data_len; char data[0];//或char data[ ...

  6. GCC 中零长数组与变长数组

    前两天看程序,发现在某个函数中有下面这段程序: int n; //define a variable n int array[n]; //define an array with length n 在 ...

  7. C++内存分配及变长数组的动态分配

    //------------------------------------------------------------------------------------------------ 第 ...

  8. PL/SQL 嵌套表变长数组和索引表[转]

    关于PL/SQL中这三种数组的介绍,不想写了.转一篇日志吧…… 链接:http://www.blogjava.net/decode360/archive/2008/08/08/280825.html ...

  9. 《OOC》笔记(3)——C语言变长参数va_list的用法

    <OOC>笔记(3)——C语言变长参数va_list的用法 C语言中赫赫有名的printf函数,能够接受的参数数目不固定,这就是变长参数.C#里也有params这个关键字用来实现变长参数. ...

随机推荐

  1. java-Properties集合。

    查看手册: 关键字: store() 储存. setProperty("",""); 添加. FileWriter("D:\\ja.propertie ...

  2. Python入门到放弃

    前传:计算机基础 01-计算机基础1 02-计算机基础2 第一章:Python入门 01-python入门之解释器环境安装 02-python入门之变量和基本数据类型 03-python内存管理之垃圾 ...

  3. 从原子类和Unsafe来理解Java内存模型,AtomicInteger的incrementAndGet方法源码介绍,valueOffset偏移量的理解

    众所周知,i++分为三步: 1. 读取i的值 2. 计算i+1 3. 将计算出i+1赋给i 可以使用锁来保持操作的原子性和变量可见性,用volatile保持值的可见性和操作顺序性: 从一个小例子引发的 ...

  4. shell脚本基础-起始句的含义

    大部分的shell脚本第一行,要么是 #!/bin/bash 要么是 #!/bin/sh 其实第二种是第一种的升级版,增加了协议posix(#!/bin/sh = #!/bin/bash + posi ...

  5. 一款带Web面板的轻量级、高性能内网穿透工具:nps使用教程

    说明:内网穿透工具之前已经介绍了不少了,比如Frp.lanproxy.Holer等,现在再介绍个带Web面板的穿透工具nps,之前叫easyProxy,只是改名了而已,该工具是一款使用go语言编写的轻 ...

  6. 最大比率传输(Maximum Ratio Transmission, MRT)原理分析

    转载请注明出处. 最大比率发射(Maximum Ratio Transmission, MRT)是文献中经常看见的一个词,今天就在这里做一下笔记. 参考文献为:T. K. Y. Lo, "M ...

  7. [模拟]Codeforces Circle of Students

    Circle of Students time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  8. Building Applications with Force.com and VisualForce(Dev401)(十九):Visualforce Pages: Visualforce Componets (Tags)

    Dev401-020:Visualforce Pages: Visualforce Componets (Tags) Module Agenda1.Tag Basics2.Tag Bindings T ...

  9. node.js初步

    Node.js介绍 Node.js 诞生于2009年,Node.js采用C++语言编写而成,是 一个Javascript的运行环境.Node.js 是一个基于 Chrome V8 引擎的 JavaSc ...

  10. pyplot 作图总结

    折线图 下面是绘制折线图,设置图片的横轴纵轴标签,图片标题的API的用法. import matplotlib.pyplot as pyplot # init pyplot.figure() # ar ...