如何在C语言中使用变长数组

  介绍

如何在C语言中使用变长数组?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

看如下代码:

# include   typedef  struct  {   int 才能;兰;   int 才能;[]数组;   }SoftArray;      int  main (), {   int 才能;len =, 10;   ,,printf (“, struct # 39; s  size  is  % d \ n", sizeof (SoftArray));   return 才能;0;   }

运行结果:

[root@VM-0-7-centos mydoc) #。/?br/> struct # 39; s大小是4

我们可以看的出,_SoftArray结构体的大小是4,显然,在32位操作系统下一个int型变量大小刚好为4,也就说结构体中的数组没有占用内存。为什么会没有占用内

存,我们平时用数组时不时都要明确指明数组大小的吗?但这里却可以编译通过呢?这就是我们常说的动态数组,也就是变长数组。

先不要乱,让我们再看一段代码

# include   # include      typedef  struct  {   int 才能;兰;   int 才能;[]数组;   }SoftArray;      int  main (), {   int 才能;len =, 10;   SoftArray 才能;* p=(SoftArray *) malloc (sizeof (SoftArray), +, sizeof (int) * len);   ,,printf (“SoftArray  size  is  % d \ n",, sizeof (SoftArray));   免费的才能(p);      return 才能;0;   }

运行结果:

[root@VM-0-7-centos mydoc) #。/4?br/> SoftArray大小是4

是不是有点奇怪,为什么申请了内存后结构体大小还是4呢?原因是动态申请的内存只是申请给数组拓展所用,从上个程序我们可以看出结构体的大小在创建时已经

确定了,数组明确来说不算是结构体成员,只是挂羊头卖狗肉而已。

下面我们来看看关于变长数组的资料:

1,什么是变长数组吗?

变长数组既数组大小待定的数组,C语言中结构体的最后一个元素可以是大小未知的数组,也就是所谓的0长度,所以我们可以用结构体来创建变长数组。

2,变长数组有什么用途?

它的主要用途是为了满足需要变长度的结构体,为了解决使用数组时内存的冗余和数组的越界问题。

3,用法:在一个结构体的最后,申明一个长度为空的数组,就可以使得这个结构体是可变长的。对于编译器来说,此时长度为0的数组并不占用空间,因为数组名

本身不占空间,它只是一个偏移量,数组名这个符号本身代表了一个不可修改的地址常量(注意:数组名永远都不会是指针!),但对于这个数组的大小,我们

可以进行动态分配,对于编译器而言,数组名仅仅是一个符号,它不会占用任何空间,它在结构体中,只是代表了一个偏移量,代表一个不可修改的地址常量!

对于变长数组的这个特点,很容易构造出变成结构体,如缓冲区,数据包等等

typedef  struct  {   int 才能;兰;   int 才能;[]数组;   }SoftArray;

这样的变长数组常用于网络通信中构造不定长数据包,不会浪费空间浪费网络流量,比如我要发1024字送节的数据,如果用定长包,假设定长包的长度为2048,就

会浪费1024个字节的空间,也会造成不必要的流量浪费。

举个简单例子。

# include   # include      typedef  struct  {   int 才能;兰;   int 才能;[]数组;   }SoftArray;      int  main (), {   int 才能,len=10,我=0;   SoftArray 才能;* p=(SoftArray *) malloc (sizeof (SoftArray) + sizeof (int) * len);   p→才能len=兰;   ,,,(小姐:=,0;小姐:& lt;, p→len;我+ +),{   ,,,p→阵列[我],=,+ 1;   ,,}   ,,,(小姐:=,0;小姐:& lt;, p→len;我+ +),{   ,,,printf (“% d \ n",, p→阵列[我]);   ,,}   免费的才能(p);      return 才能;0;   }

运行结果:

[root@VM-0-7-centos mydoc) #。/a.out 

注意,内存对齐字节偏移
解决:资料【3】

# pragma 包(1)   struct  node  {   int 才能,xxx;//4字节   char 才能;多;//1字节   char 才能;数据[0];//零字节数组   }   # pragma 包()

看完上述内容,你们掌握如何在C语言中使用变长数组的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

如何在C语言中使用变长数组