一、柔性数组

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

#include<stdio.h>
#include<string.h>
#include<stdlib.h> typedef struct
{
char ucDstMac[];
char ucSrcMac[];
int usType;
int usLen;
char ucCode;
char ucSeq;
char ucSlot;
char ucInfo[];
}DEV_CARD_MSG_S; int main(void)
{
int i = ;
DEV_CARD_MSG_S* DS1;
char data[];
DS1 = (DEV_CARD_MSG_S*)malloc(sizeof(DEV_CARD_MSG_S));
memset(data,,sizeof(data));
DS1 = (DEV_CARD_MSG_S*)data;
DS1-> ucCode = 'A';
DS1-> ucInfo[] = 'B';
printf("DS1-> ucCode=%c\nDS1-> ucInfo[6]=%c\n",DS1-> ucCode,DS1-> ucInfo[]);
for(i=;i<;i++)
printf("data[%d]=%c\n",i,data[i]); return ;
}

好奇怪啊,有木有,结构体中竟然定义了一个包含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 = ;
P = &a;
*P =;
printf(" a = %d\n*P = %d\n",a,*P);
printf("&a = %p\n P = %p\n",&a,P);
return ;
}

程序执行结果如下:

我们看到,我们操作P指针也就是操作a变量,同时他们两个占用的内存地址是一样的。因此只要*P的值改变了,a的值也就跟着改变了。这个特点很重要,在工程中应用的还是蛮多的。

(四)C语言柔性数组、指针赋值的更多相关文章

  1. C语言柔性数组和动态数组

    [前言]经常看到C语言里的两个数组,总结一下. 一.柔性数组 参考:https://www.cnblogs.com/veis/p/7073076.html #include<stdio.h> ...

  2. C语言柔性数组讲解

    #include<stdio.h> typedef struct _SoftArray{ int len; int array[]; }SoftArray; int main() { ; ...

  3. C语言柔性数组

    结构中最后一个元素允许是未知大小的数组,这个数组就是柔性数组.但结构中的柔性数组前面必须至少一个其他成员,柔性数组成员允许结构中包含一个大小可变的数组,sizeof返回的这种结构大小不包括柔性数组的内 ...

  4. C++语言中数组指针和指针数组彻底分析

    #################################                              ##       基本知识               ##        ...

  5. C语言的数组指针

    数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element).数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存.以int arr[] = { 99, ...

  6. c语言的数组指针与指针数组

    1. 数组指针:指向数组的指针是数组指针 先看下面一段代码: #include <stdio.h> int main(void) { int m[10]; printf("m = ...

  7. [拾零]C语言的数组指针

    为了强化记忆,从而写笔记保留. 数组指针,顾名思义,是在说一个指针,这个指针是指向数组的. 区别于指针数组 int* p[5] = NULL; //指针数组 基类型 int* int (*p)[5] ...

  8. C语言 结构体指针赋值 incompatible types when assigning to type 'char[20]' from type 'char *'

    strcpy(pstudent->name, "guo zhao wei "); 为什么错误,该怎么写,(红色行)     追问 为什么不能直接赋值啊, 追答 用char n ...

  9. C语言提高 (4) 第四天 数组与数组作为参数时的数组指针

    1昨日回顾 const int 和 int const是一样的 const char *p;值不变 char * const p; 指针不能变 编译器对参数的退化: 第三种模型: 三级指针 三级指针局 ...

随机推荐

  1. jsoup的基本写法

    jsoup这个工具用于抓取并解析网页,用起来也比较简单,语法上与Jquery类似,基本写法如下: File input = new File("/tmp/input.html"); ...

  2. WPF中viewmodel层怎样得到view层的TabControl控件对象?

    View层: <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns: ...

  3. PHP值mysql操作类

    <?php /** * Created by PhpStorm. * User: Administrator * Date: 2016/6/27 * Time: 18:55 */ Class M ...

  4. ubuntu /etc/profile和/etc/environment的比较

    先将export LANG=zh_CN加入/etc/profile ,退出系统重新登录,登录提示显示英文. 将/etc/profile 中的export LANG=zh_CN删除,将LNAG=zh_C ...

  5. 检索COM类工厂中CLSID为{000209FF-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误: 80070005

    检索COM类工厂中CLSID为{000209FF-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误: 80070005 http://blog.csdn.net ...

  6. java反编译工具JD-GUI

    这款java反编译工具是由C++写的,是一款免费的非商业用途的软件,(Xjad也不错,但是不支持jar反编译) 一.支持众多.class反编译工具 二.支持反编译jar

  7. Linux按照CPU、内存、磁盘IO、网络性能监测

      系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书 ...

  8. Twitter数据抓取

    说明:这里分三个系列介绍Twitter数据的非API抓取方法.有兴趣的QQ群交流: BitCrawler网络爬虫QQ群 322937592 1.Twitter数据抓取(一) 2.Twitter数据抓取 ...

  9. java简单的页面制作

    package 界面; import java.awt.*; import javax.swing.JFrame; import javax.swing.*; //import javax.swing ...

  10. Android开发开始--环境搭建

    一.搭建Android开发环境 1.JDK (Java Development Kit) 2.Eclipse 3.Android SDK (Software Development Kit) 4.AD ...