时间:2021-05-20
看如下代码:
#include<stdio.h>typedef struct { int len; int array[];}SoftArray;int main() { int len = 10; printf("The struct's size is %d\n",sizeof(SoftArray)); return 0;}运行结果:
[root@VM-0-7-centos mydoc]# ./a.out
The struct's size is 4
我们可以看出,_SoftArray结构体的大小是4,显然,在32位操作系统下一个int型变量大小刚好为4,也就说结构体中的数组没有占用内存。为什么会没有占用内
存,我们平时用数组时不时都要明确指明数组大小的吗?但这里却可以编译通过呢?这就是我们常说的动态数组,也就是变长数组。
先不要乱,让我们再看一段代码
#include<stdio.h>#include<malloc.h>typedef struct { int len; int array[];}SoftArray;int main() { int len = 10; SoftArray *p=(SoftArray*)malloc(sizeof(SoftArray) + sizeof(int)*len); printf("SoftArray size is %d\n", sizeof(SoftArray)); free(p); return 0;}运行结果:
[root@VM-0-7-centos mydoc]# ./a.out
SoftArray size is 4
是不是有点奇怪,为什么申请了内存后结构体大小还是4呢?原因是动态申请的内存只是申请给数组拓展所用,从上个程序我们可以看出结构体的大小在创建时已经
确定了,array明确来说不算是结构体成员,只是挂羊头卖狗肉而已。
下面我们来看看关于变长数组的资料:
1、什么是变长数组?
变长数组既数组大小待定的数组, C语言中结构体的最后一个元素可以是大小未知的数组,也就是所谓的0长度,所以我们可以用结构体来创建变长数组。
2、变长数组有什么用途 ?
它的主要用途是为了满足需要变长度的结构体,为了解决使用数组时内存的冗余和数组的越界问题。
3、用法 :在一个结构体的最后 ,申明一个长度为空的数组,就可以使得这个结构体是可变长的。对于编译器来说,此时长度为0的数组并不占用空间,因为数组名
本身不占空间,它只是一个偏移量, 数组名这个符号本身代 表了一个不可修改的地址常量 (注意:数组名永远都不会是指针! ),但对于这个数组的大小,我们
可以进行动态分配,对于编译器而言,数组名仅仅是一个符号,它不会占用任何空间,它在结构体中,只是代表了一个偏移量,代表一个不可修改的地址常量!
对于变长数组的这个特点,很容易构造出变成结构体,如缓冲区,数据包等等
typedef struct { int len; int array[];}SoftArray;这样的变长数组常用于网络通信中构造不定长数据包,不会浪费空间浪费网络流量,比如我要发送1024字节的数据,如果用定长包,假设定长包的长度为2048,就
会浪费1024个字节的空间,也会造成不必要的流量浪费。
举个简单例子。
#include<stdio.h>#include<malloc.h>typedef struct { int len; int array[];}SoftArray;int main() { int len=10, i=0; SoftArray *p=(SoftArray*)malloc(sizeof(SoftArray)+sizeof(int)*len); p->len=len; for(i = 0;i < p->len;i++) { p->array[i] = i+1; } for(i = 0;i < p->len;i++) { printf("%d\n", p->array[i]); } free(p); return 0;}运行结果:
[root@VM-0-7-centos mydoc]# ./a.out
注意,内存对齐字节偏移
解决:资料【3】
1、https:///veis/p/7073076.html
3、https://blog.csdn.net/dalerkd/article/details/69666716
到此这篇关于C语言变长数组使用详解的文章就介绍到这了,更多相关C语言变长数组内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C/C++动态数组的创建的实例详解在C++语言中,二维动态数组主要使用指针的方法建立,以建立一个整数二维数组为例:#include#include#includ
1.C语言编码需要保证变长数组的长度参数位于合法范围之内例如以下代码:voidfunc(size_ts){intvla[s];}fu
详解Swift中对C语言接口缓存的使用以及数组与字符串转为指针类型的方法由于Swift编程语言属于上层编程语言,而Swift中由于为了低层的高性能计算接口,所以
详解C语言用malloc函数申请二维动态数组的实例C语言在程序运行中动态的申请及释放内存十分方便,一维数组的申请及释放比较简单。Sampleone#includ
本文实例讲述了C#使用List类实现动态变长数组的方法。分享给大家供大家参考。具体如下:C#中的list可以当做数组使用,而且无需定义长度,完全是动态的clas