一、柔性数组

今天看了公司的代码,发现一个很奇怪的问题,后来自己写了类似代码,我先把代码贴出来吧。

#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语言柔性数组、指针赋值相关推荐

  1. 【C 语言】数组 ( 指针数组用法 | 自我结束能力 )

    文章目录 一.指针数组用法 ( 自我结束能力 ) 二.完整代码示例 一.指针数组用法 ( 自我结束能力 ) 在上一篇博客 [C 语言]数组 ( 指针数组用法 | 命令行参数处理 ) 中的主函数中的 c ...

  2. 用c语言赋值表示的例子,一起talk C栗子吧(第五回:C语言实例--数组巧妙赋值)...

    一起talk C栗子吧(第五回:C语言实例--数组巧妙赋值) 各位看官们,大家好,从今天开始,我们讲大型章回体科技小说 :C栗子,也就是C语言实例.闲话休提, 言归正转.让我们一起talk C栗子吧! ...

  3. 图解C语言中数组指针、指针数组、函数指针、函数指针数组、指向函数指针数组的指针

    关于C语言中数组指针.函数指针.指针数组.函数指针数组.指向函数指针数组的指针一直比较绕,稍微整理一下. 到底是指针还是数组? 其实到底是指针还是数组还是看变量名与[]先结合还是*先结合.我们知道C语 ...

  4. 【C语言】数组指针与指针数组的区分与应用

    这里以一道C语言题--输出矩阵两个对角线上的数(二维数组)为例 7-57 输出矩阵两个对角线上的数(二维数组) (6 分) 编写程序,将数据输入一个n * n二维数组中,输出矩阵两个对角线上的数.假设 ...

  5. C语言:数组指针(一个指针)

    数组指针:就是一个指针,指向了一个数组地址,偏移的时候是偏移整个数组. . 1.数组指针的定义及赋值: int a[3] = {1,2,3};int (*p)[3]; 定义 p = a; 或 p = ...

  6. c语言:数组指针,指针数组,函数指针,函数指针数组,指向函数指针数组的指针

    指针是一种保存变量地址的变量.在c语言中,指针的用途十分广泛,而其与数组和函数的关系也十分密切.下面我们来简单介绍一些指针的应用. 1.指针数组 指针数组:首先它是一个数组,这个数组中的内容都是指针变 ...

  7. c语言冒泡排序数组指针,c语言冒泡排序,指针,数组

    冒泡排序算法的运作如下: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的元素重复 ...

  8. 【C 语言】数组 ( 指针退化验证 | 计算数组大小 | #define LENGTH(array) (sizeof(array) / sizeof(*array)) )

    文章目录 一.指针退化验证 二.完整代码示例 一.指针退化验证 nnn 维数组 作为 函数参数 , 会退化为 指针 , 注意这里只有 最高维 第 nnn 维 会 退化为指针 , 该指针指向 若干 n− ...

  9. C语言通过数组指针获取长度

    2019独角兽企业重金招聘Python工程师标准>>> 指针 指针:记录变量或对象的内存存储位置 缺陷:C 使用数组一般使用数组指针形式,并且显示指定数组长度,但是无法处理动态数组的 ...

最新文章

  1. 嵌入式linux alsa,嵌入式Linux下ALSA音频架构ALSA-lib移植与编译心得
  2. 第二章 -- (第一单元) -- 自动安装虚拟机
  3. 项目整体管理:项目整体管理实现过程
  4. 调整HashMap的大小:未来的危险
  5. 调整selinux状态为disabled
  6. 后台原理_电气控制原理动图22张,超赞!
  7. uint16 累加_如何把一个uint16整数分解成两个字节并传输?
  8. WIN7常用的15个快捷键组合
  9. eclipse要修改的配置
  10. 虚拟化顶级技术会议KVM Forum演讲分享 | 移动云KVM共享云盘技术实践
  11. 接VS2010+Net+MVC3+EF4.1环境下的Code First一文的补充说明
  12. 第1章 操作系统引论课后答案
  13. 软件工程__CMMCMMI
  14. linux优化deepin启动速度,如何优化 Deepin 引导开机速度?
  15. re管理器修改音量_[教程] 自己手动修改音量键和开机键的功能方法(小更新)
  16. 小朋友你是否有很多问号图_小朋友你是否有很多问号表情包
  17. python画空心圆图_OpenCV-Python系列之绘图功能
  18. html+css第九篇
  19. 硬盘坏道终结者---低级格式化
  20. mimikatz hash传递--获取域控权限

热门文章

  1. 当数据库遇见FPGA:X-DB异构计算如何实现百万级TPS?
  2. 冻结拆分_冻结首行与尾行?还有能这种操作
  3. keycode对照表(键码对照表)
  4. 【MySQL】查看MySQL配置文件路径及相关配置
  5. 使用shell脚本监控共享池内存碎片
  6. 谈谈一些有趣的CSS题目(十七)-- 不可思议的颜色混合模式 mix-blend-mode
  7. 微信小程序使用adb工具
  8. Hadoop数据倾斜及解决办法
  9. lazy初始化和线程安全的单例模式
  10. 疯狂秀才权限管理系统,开源了