(四)C语言柔性数组、指针赋值
一、柔性数组
今天看了公司的代码,发现一个很奇怪的问题,后来自己写了类似代码,我先把代码贴出来吧。
#include<stdio.h> #include<string.h> #include<stdlib.h>typedef struct {char ucDstMac[6];char ucSrcMac[6];int usType; int usLen; char ucCode; char ucSeq; char ucSlot; char ucInfo[]; }DEV_CARD_MSG_S;int main(void) {int i = 0;DEV_CARD_MSG_S* DS1;char data[64];DS1 = (DEV_CARD_MSG_S*)malloc(sizeof(DEV_CARD_MSG_S));memset(data,0,sizeof(data));DS1 = (DEV_CARD_MSG_S*)data;DS1-> ucCode = 'A';DS1-> ucInfo[6] = 'B';printf("DS1-> ucCode=%c\nDS1-> ucInfo[6]=%c\n",DS1-> ucCode,DS1-> ucInfo[6]);for(i=0;i<64;i++)printf("data[%d]=%c\n",i,data[i]);return 0; }
好奇怪啊,有木有,结构体中竟然定义了一个包含0个元素的数组,当时看到这里就晕晕的。后来查找了资料,才知道这就是传说中柔性数组,柔性数组一般应用在结构体中,数组大小可变的场合中。
我们分析上述程序,data是一个占64字节的字符数组,DS1 = (DEV_CARD_MSG_S*)这行代码相当于给DS1结构体分配了64字节的地址,而这个结构体中定义时只申请了23字节的地址,此时还省64-23=41字节的地址会全部分配给DEV_CARD_MSG_S结构体中的ucInfo数组,因此此时即使我们写出DS1->ucInfo[40]='D'也是合法的,因为我们为数组ucInfo申请了41字节的地址空间。
上述程序打印如下,只贴出一部分:
(二)指针赋值
我们看上面代码执行的结果,发现我们代码中只操作了DS1结构体指针,结果data数组的值也跟着变化了,而且地址是对应的。刚开始看到这种神奇的代码我也好好奇。我们看到程序中有这么一行代码:DS1 = (DEV_CARD_MSG_S*)data;这是指针之间的赋值,也就是说结构体DS1和data数组在内存中占用的地址是一样的。其实这个代码和下面这个是类似的,我们看下面的代码就可以很好地理解了。
#include<stdio.h> int main() {int *P = NULL;int a = 10;P = &a;*P =20;printf(" a = %d\n*P = %d\n",a,*P);printf("&a = %p\n P = %p\n",&a,P);return 0; }
程序执行结果如下:
我们看到,我们操作P指针也就是操作a变量,同时他们两个占用的内存地址是一样的。因此只要*P的值改变了,a的值也就跟着改变了。这个特点很重要,在工程中应用的还是蛮多的。
转载于:https://www.cnblogs.com/zhangshenghui/p/5368495.html
(四)C语言柔性数组、指针赋值相关推荐
- 【C 语言】数组 ( 指针数组用法 | 自我结束能力 )
文章目录 一.指针数组用法 ( 自我结束能力 ) 二.完整代码示例 一.指针数组用法 ( 自我结束能力 ) 在上一篇博客 [C 语言]数组 ( 指针数组用法 | 命令行参数处理 ) 中的主函数中的 c ...
- 用c语言赋值表示的例子,一起talk C栗子吧(第五回:C语言实例--数组巧妙赋值)...
一起talk C栗子吧(第五回:C语言实例--数组巧妙赋值) 各位看官们,大家好,从今天开始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例.闲话休提, 言归正转.让我们一起talk C栗子吧! ...
- 图解C语言中数组指针、指针数组、函数指针、函数指针数组、指向函数指针数组的指针
关于C语言中数组指针.函数指针.指针数组.函数指针数组.指向函数指针数组的指针一直比较绕,稍微整理一下. 到底是指针还是数组? 其实到底是指针还是数组还是看变量名与[]先结合还是*先结合.我们知道C语 ...
- 【C语言】数组指针与指针数组的区分与应用
这里以一道C语言题--输出矩阵两个对角线上的数(二维数组)为例 7-57 输出矩阵两个对角线上的数(二维数组) (6 分) 编写程序,将数据输入一个n * n二维数组中,输出矩阵两个对角线上的数.假设 ...
- C语言:数组指针(一个指针)
数组指针:就是一个指针,指向了一个数组地址,偏移的时候是偏移整个数组. . 1.数组指针的定义及赋值: int a[3] = {1,2,3};int (*p)[3]; 定义 p = a; 或 p = ...
- c语言:数组指针,指针数组,函数指针,函数指针数组,指向函数指针数组的指针
指针是一种保存变量地址的变量.在c语言中,指针的用途十分广泛,而其与数组和函数的关系也十分密切.下面我们来简单介绍一些指针的应用. 1.指针数组 指针数组:首先它是一个数组,这个数组中的内容都是指针变 ...
- c语言冒泡排序数组指针,c语言冒泡排序,指针,数组
冒泡排序算法的运作如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复 ...
- 【C 语言】数组 ( 指针退化验证 | 计算数组大小 | #define LENGTH(array) (sizeof(array) / sizeof(*array)) )
文章目录 一.指针退化验证 二.完整代码示例 一.指针退化验证 nnn 维数组 作为 函数参数 , 会退化为 指针 , 注意这里只有 最高维 第 nnn 维 会 退化为指针 , 该指针指向 若干 n− ...
- C语言通过数组指针获取长度
2019独角兽企业重金招聘Python工程师标准>>> 指针 指针:记录变量或对象的内存存储位置 缺陷:C 使用数组一般使用数组指针形式,并且显示指定数组长度,但是无法处理动态数组的 ...
最新文章
- 嵌入式linux alsa,嵌入式Linux下ALSA音频架构ALSA-lib移植与编译心得
- 第二章 -- (第一单元) -- 自动安装虚拟机
- 项目整体管理:项目整体管理实现过程
- 调整HashMap的大小:未来的危险
- 调整selinux状态为disabled
- 后台原理_电气控制原理动图22张,超赞!
- uint16 累加_如何把一个uint16整数分解成两个字节并传输?
- WIN7常用的15个快捷键组合
- eclipse要修改的配置
- 虚拟化顶级技术会议KVM Forum演讲分享 | 移动云KVM共享云盘技术实践
- 接VS2010+Net+MVC3+EF4.1环境下的Code First一文的补充说明
- 第1章 操作系统引论课后答案
- 软件工程__CMMCMMI
- linux优化deepin启动速度,如何优化 Deepin 引导开机速度?
- re管理器修改音量_[教程] 自己手动修改音量键和开机键的功能方法(小更新)
- 小朋友你是否有很多问号图_小朋友你是否有很多问号表情包
- python画空心圆图_OpenCV-Python系列之绘图功能
- html+css第九篇
- 硬盘坏道终结者---低级格式化
- mimikatz hash传递--获取域控权限