c语言变长数组例子,C语言变长数组

#include

#include

#include

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;

}

b19c2663f32f3a2ef048087bd97d7799.png

根据结果可以得出的信息

结构体的地址和结构体中第一个元素的地址是相同的

Array在结构体中“不占空间”

实现的前提:

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

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

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

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 ...

c语言,变长数组

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

GCC 中零长数组与变长数组

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

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

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

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

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

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

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

随机推荐

html5 canvas 旋转扩大

...

Linux系统性能监控

系统的性能指标主要包括CPU.内存.磁盘I/O.网络几个方面. 1. CPU性能 (1)利用vmstat命令监控系统CPU 该命令可以显示关于系统各种资源之间相关性能的简要信息,这里我们主要用它来看C ...

DOS窗口中文显示乱码

记得以前的dos是可以显示中文的,但是今天复制东西发现竟然不能显示中文了,遇见中文就成了? 在右键->默认值中的默认代码页也显示有中文GBK,但是不管用 在右键->属性中的当前代码页显示为 ...

Connector for Python

连接mysql, 需要mysql connector, conntector是一种驱动程序,python连接mysql的驱动程序,mysql官方给出的名称为connector/python, 可参考m ...

表单取消历史保存之autocomplete的用法

表单取消历史保存之autocomplete的用法 应用场景 浏览器开启了表单自动填充设置后,有些表单中的input元素在添加时会以下拉的形式显示以前填写过的表单,有时候可能会影响用户的使用.比如:da ...

抛弃配置后的Spring终极教程

一:前言 Spring 有XML配置和注解两种版本,我个人非常喜欢使用注解,相当热衷Spring boot! 对于Spring,核心就是IOC容器,这个容器说白了就是把你放在里面的对象(Bean)进行 ...

Oracle 数据库监听配置和服务

-- 补充说明 如果要远程连接192.168.10.44上的oracle,那么192.168.10.44服务器必须启动TNSListener.(配置文件 listener.ora) PLSQL Dev ...

多次使用图片物理路径提示占用进程,用流读取设置FileShare权限解决

//用流读取图片 清空之后再次关联地址 //设置FileShare.ReadWrite权限之后 不会提示占用进程异常 item是物理路径DiscussionImageList = new Interv ...

从一个简单的约束看规范性的SQL脚本对数据库运维的影响

之前提到了约束的一些特点,看起来也没什么大不了的问题,http://www.cnblogs.com/wy123/p/7350265.html以下以实际生产运维中遇到的一个问题来说明规范的重要性. 如下 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值