用游戏人物做网站属于侵权吗,国外做免费的视频网站,公众号模板网站,100个顺口的公司名字#x1f466;个人主页#xff1a;Weraphael ✍#x1f3fb;作者简介#xff1a;目前是C语言学习者 ✈️专栏#xff1a;C语言航路 #x1f40b; 希望大家多多支持#xff0c;咱一起进步#xff01;#x1f601; 如果文章对你有帮助的话 欢迎 评论#x1f4ac; 点赞个人主页Weraphael ✍作者简介目前是C语言学习者 ✈️专栏C语言航路 希望大家多多支持咱一起进步 如果文章对你有帮助的话 欢迎 评论 点赞 收藏 加关注 前言 说起数组一维数组、二维数组、字符数组、整型数组和浮点型数组我相信大家并不陌生吧今天我们一起看看柔性数组 目录前言一、柔性数组的概念和定义二、柔性数组的特点三、柔性数组的使用四、柔性数组的优势一、柔性数组的概念和定义 在C99中结构中的最后一个元素允许是未知大小的数组我们把这样的数组称为柔性数组成员。 【定义】
struct S
{int i;int a[]; //柔性数组
};若有些编译器无法编译可以改成以下这种 struct S
{int i;int a[0];//柔性数组成员
};二、柔性数组的特点 结构中的柔性数组前必须至少有一个其他成员 sizeof返回的这种结构大小不包括柔性数组的内存 包含柔性数组成员的结构用malloc函数进行动态内存分配并且分配的内存应该大于结构体大小以适应柔性数组的预期大小 三、柔性数组的使用 动态内存开辟函数讲解传送门 #include stdio.h
#include stdlib.h
struct S
{int i;char a[];
};
int main()
{//包含柔性数组成员的结构用malloc函数进行动态内存分配//并且分配的内存应该大于结构体大小struct S* sp (struct S*)malloc(sizeof(struct S) 10 * sizeof(char));//若sp为空指针说明开辟动态内存失败if (sp NULL){return 1;}//否则开辟成功//使用sp-i 100;for (int i 0; i 10; i){sp-a[i] x;}//打印for (int i 0; i 10; i){printf(%c , sp-a[i]);}//释放free(sp);sp NULL;return 0;
}甚至还能扩容realloc #include stdio.h
#include stdlib.h
struct S
{int i;char a[];
};
int main()
{//包含柔性数组成员的结构用malloc函数进行动态内存分配//并且分配的内存应该大于结构体大小struct S* sp (struct S*)malloc(sizeof(struct S) 10 * sizeof(char));//若sp为空指针说明开辟动态内存失败if (sp NULL){return 1;}//否则开辟成功//使用sp-i 100;for (int i 0; i 10; i){sp-a[i] x;}//扩容(多加10字节的空间)struct S* p (struct S *)realloc(sp, sizeof(struct S) sizeof(char) * 20);//如果p为空指针说明扩容失败if (p NULL){return 1;}else{sp p;p NULL;}for (int i 10; i 20; i){sp-a[i] w;}//打印printf(%d\n, sp-i);for (int i 0; i 20; i){printf(%c , sp-a[i]);}return 0;
}所以柔性数组在内存其实是这样的 它在内存是连续的 四、柔性数组的优势 除【柔性数组的使用】样例以外也可以设计成下面这样 #include stdio.h
#include stdlib.hstruct S
{int i;char* a;
};int main()
{//为结构体开辟空间struct S* sp (struct S*)malloc(sizeof(struct S));//若sp NULL说明开辟失败if (sp NULL){return 1;}//否则开辟成功//使用内存空间sp-i 100;//为char* a开辟10个字节空间sp-a (char*)malloc(sizeof(char) * 10);//使用for (int i 0; i 10; i){sp-a[i] w;}//或者还能为char* a扩容char* p (char*)realloc(sp-a, 20 * sizeof(char));if (p NULL){return 1;}else{sp-a p;p NULL;}//使用扩容的空间for (int i 10; i 20; i){sp-a[i] J;}//打印printf(int i %d\n, sp-i);for (int i 0; i 20; i){printf(%c , sp-a[i]);}//释放空间free(sp-a);sp-a NULL;free(sp);sp NULL;return 0;
}一个常见的问题为什么要先释放sp-a的内存空间 首先程序是先为结构体开辟空间 接着又为char*开辟空间 所以若先对sp释放空间到后面就不能通过sp找到char* c开辟的空间 柔性数组好处的总结 对于柔性数组来说开辟空间malloc只需要一个释放空间free也只需要一次且内存空间是连续的而对于上面的代码来说开辟空间需要二次释放空间也同样需要二次且内存空间是不连续的。所以它第一个好处是方便内存释放连续的内存有益于提高访问速度