C语言变长数组
#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;
}
根据结果可以得出的信息
- 结构体的地址和结构体中第一个元素的地址是相同的
- Array在结构体中“不占空间”
实现的前提:
数组必须在结构体的最后,因为malloc的是整个结构体,如果数组不在最后,申请的空间会覆盖后面元素的空间
C语言变长数组的更多相关文章
- 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的用法
<OOC>笔记(3)——C语言变长参数va_list的用法 C语言中赫赫有名的printf函数,能够接受的参数数目不固定,这就是变长参数.C#里也有params这个关键字用来实现变长参数. ...
随机推荐
- Python基础篇(五)_文件和数据格式化
Python基础篇_文件和数据格式化 文件的使用:文件打开.关闭.读写 文件打开:通过open()函数打开文件,并返回一个操作文件的变量. 使用语法:<变量名> = (<文件路径以及 ...
- 测试必知必会系列- Linux常用命令 - ps(重点)
21篇测试必备的Linux常用命令,每天敲一篇,每次敲三遍,每月一循环,全都可记住!! https://www.cnblogs.com/poloyy/category/1672457.html 查看所 ...
- Python基础 | 日期时间操作
目录 获取时间 时间映射 格式转换 字符串转日期 日期转字符串 unixtime 时间计算 时间偏移 时间差 "日期时间数据"作为三大基础数据类型之一,在数据分析中会经常遇到. 本 ...
- C# datagridview 格式化单元格内容
private void dgvBig_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { if (dgvB ...
- 为 .net 生态贡献力量——制作并上传 nuget 包(内有独家彩蛋)
前言 nuget 是 .net 的常用包管理器,目前已经内置到 Visual Studio 2012 以后的版本.大多数 .net 包都托管在 nuget.org,包括 .net core 框架基础包 ...
- 洛谷1363 幻象迷宫dfs
题目网址:https://www.luogu.com.cn/problem/P1363 迷宫是无限多块地图拼接而成的,问是否可以在迷宫中走无限远.解决方案是dfs,走出初始地图之后的位置映射到原位置( ...
- dfs 例题皇后问题
题目描述 一个如下的 6 \times 66×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列 ...
- JS HEX十六进制与RGB, HSL颜色的相互转换【转载】
Mark[转载] https://www.zhangxinxu.com/wordpress/2010/03/javascript-hex-rgb-hsl-color-convert/
- 一文彻底搞懂BP算法:原理推导+数据演示+项目实战(上篇)
欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 反向传播算法(Backpropagation Algorithm, ...
- webpack配置打包vue文件
1.首先全局安装node,和npm.检查是否安装成功 2.新建一个文件下,进入该文件夹. 前先执行 npm init -y 然后就会在文件夹下出现一个package.json文件 然后执行 npm i ...