当前位置: 首页 > news >正文

怎么注册一个域名南宁百度关键词优化

怎么注册一个域名,南宁百度关键词优化,国外网站建设公司,钢丝网片每平米价格可变数组 ​专栏内容#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页#xff1a;我的主页 座右铭#xff1a;天行健#xff0c;君子以自强不息#xff1b;地势坤#xff0c;君子以厚德载物. 概述 数组中元素是顺序存放#xff0c;这一特性让我们…可变数组 ​专栏内容 postgresql内核源码分析 手写数据库toadb 并发编程 个人主页我的主页 座右铭天行健君子以自强不息地势坤君子以厚德载物. 概述 数组中元素是顺序存放这一特性让我们存储和访问数据都很简单 但也因为这一特性我们在写代码时往往不能确定数组元组的个数只能按最大的数量进行预分配 这不仅造成了空间浪费而且使用起来不友好明明我们要运行一个小数据集但却要很多内存空间。 这就产生了可变数组它的元素数量不需要在代码中确定而是在运行时确定。 实现方式 可变数组在我们的程序中经常遇到但是它有那些实现方式呢 根据数组存储内存区域的不同可以分为 栈内存实现方式堆内存实现方式 下面我们就来看看它们是如何实现有什么不同 栈内存实现 这里C99中新增的VLA(variable-length array) 特性可以让我们在用的时候定义数组,数组的长度不再是静态值可以是变量中的值。 也就是说数组的长度在程序编译阶段是不确定的直到运行时再能确定这就避够我们定义一个最大的数组产生很多空间浪费。 举例 void test(int n) {/* check */if(n 0){return;}// int arr[n] {0};int arr[n];/* todo */for(int i0; i n; i){arr[i] i;}return; }数组arr的长度是变量n来确定 注意事项 这个特性是C99引入并不是所有的编译器都能完全支持我使用的 gcc 版本是支持的。 [senllanghatch toadbtest]$ gcc -v Using built-in specs. COLLECT_GCCgcc COLLECT_LTO_WRAPPER/usr/libexec/gcc/x86_64-redhat-linux/8/lto-wrapper OFFLOAD_TARGET_NAMESnvptx-none OFFLOAD_TARGET_DEFAULT1 Target: x86_64-redhat-linux Configured with: ../configure --enable-bootstrap --enable-languagesc,c,fortran,lto --prefix/usr --mandir/usr/share/man --infodir/usr/share/info --with-bugurlhttp://bugzilla.redhat.com/bugzilla --enable-shared --enable-threadsposix --enable-checkingrelease --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-gcc-major-version-only --with-linker-hash-stylegnu --enable-plugin --enable-initfini-array --with-isl --disable-libmpx --enable-offload-targetsnvptx-none --without-cuda-driver --enable-gnu-indirect-function --enable-cet --with-tunegeneric --with-arch_32x86-64 --buildx86_64-redhat-linux Thread model: posix gcc version 8.5.0 20210514 (Red Hat 8.5.0-19) (GCC)使用VLA定义的数组不能在定义时初始化否则会产生以下错误因为它不能使用默认的初始化器必须由用户自己来初始化 [senllanghatch toadbtest]$ gcc test.c test.c: In function ‘test’: test.c:9:5: error: variable-sized object may not be initializedint arr[n] {0};^~~ test.c:9:19: warning: excess elements in array initializerint arr[n] {0};堆内存实现 在用的时候通过malloc动态申请数组空间空间大小为 数组元素类型的n倍n是我们需要的数组大小它可以是输入也可以是程序运行过程中的可变值。 这种方式是我们普遍使用的也是所有编译器都支持的。 举例 void test(int n) {int *arr NULL;/* check */if(n 0){return;}arr (int *)malloc(sizeof(int)*n);if(NULL arr){return ;}/* todo */for(int i0; i n; i){arr[i] i;}return; }访问方式 数组访问一般有指针方式和下标方式这与普通数组没有什么区别为什么要谈数组的访问方式呢 因为这里会隐藏着惊天大坑我们接着往下看。 C语言里一般数组可以转成指针当然指针也可以转成数组来用。 数组下标访问 这就很简单了数组中的元素都是顺序排列那么按它们的位置序号访问就可以。 对于VLA方式定义还是动态申请方式分配的空间它们的元素存储的内存空间都是连续的所以两种方式下都可以用下标的方式来访问。 对于数组那就再正常不过了递增下标就可以获取到各元素的值而对于动态申请的数组本身就是指向内存空间的首地址也可以理解为指向数组的指针即常说的数组指针用下标的方式就可以直接获取到对应的元素值。 /* 如上面举例指针类型定义的数组也可以下标进行访问 */ int *arr NULL; arr[i] i;指针访问 指针形式访问每次指针的移动步长都是指针基础类型的字节数 此时取值时就要以指针的方式来取值 对于VLA方式定义还是动态申请方式分配的空间它们的元素存储的内存空间都是连续的所以两种方式下都可以用指针的方式来访问。 对于数组数组名就是首个元素的地址遍历时每次递增1就会移动到下一个元素的地址而对于动态申请的数组本身就是指向内存空间的首地址也是0号元素的首地址 int testarr[n]; int *arr testarr;for(int i 0; i n; i,arr) {*arr i; }此处专门定义一个数组然后将数组首地址赋给指针用指针来访问数组元素 可变数组的嵌套使用 如果一个结构体里含有可变数组同时结构体又存在嵌套看起来都有点复杂那它如何分配空间和访问呢 定义 假如我们定义如下结构体最终我们使用的是 stGroupData 这个结构体 typedef struct Postion {int x;int y; }stPosition, *pstPostion;typedef struct MemberData {int posCnt;stPosition posArr[]; }stMemberData, *pstMemberData;typedef struct GroupData {int group_id;int memberCnt;stMemberData memberData[]; }stGroupData, *pstGroupData;大家是否好奇上面结构的大小时多少呢这个留给大家一个作业知道答案的同学可以在评论区给出来。 分配空间 因为存在嵌套所以就不能用VLA这个特性了只能用动态分配了。 动态分配时需要对外层结构体和内层结构体的元素分别计算这里很容易遗漏 假设我们有一组数据需要2个memberdata: memberdata 0: 有3个postion memberdata 1: 有1个postion 坑一占用空间 空间需要分配多少呢 可能初看好像是sizeof(stGroupData) 就可以了再看其实需要 sizeof(stGroupData) 2*sizeof(stMemberData) 大小 这就掉坑里了。下面是正确的大小计算 计算空间大小 int size 0; pstGroupData pgData NULL;/* 计算一个要分配的空间大小假设2个memberdata:* memberdata 0: 有3个postion* memberdata 1: 有1个postion */ size sizeof(stGroupData) 2*sizeof(stMemberData) 4 * sizeof(stPosition); pgData (pstGroupData)malloc(size);这里计算size时先计算结构体头部的size因为数组部分没有定义长度sizeof 出的来的值是不包含的所以需要单独计算 外层stGroupData中包含两个元素 内层 stMemberData中分别为 3和1也就是4个元素空间 再加上外层的结构体大小就是整个所占的内存空间。 它们的内存空间分布情况假设首地址从0开始 访问数组 那么按上面的例子定义了一个结构体如何访问各个数组元素呢 可能有小伙伴立刻就想到了下标的方式 那么我们来看一下 坑二下标访问 此时我们用下标方式引用会是正确的吗 pgData-memberData[0] pgData-memberData[1] memberData[0] 与 memberData[1]的地址相差应该是一个元素的sizeof(stMemberData) 4,也就是一个int posCnt空间大小 从内存分布图来看就会变成这样 嵌套可变数组的访问 此时下标访问是不对的不能采用默认的类型大小进行移动 只能用指针方式来访问同时需要自己计算下一个元素的偏移大小 pstMemberData pmData NULL;/* memberData[0] */ pmData pgData-memberData;/* memberData[1] */ pmData (pstMemberData)((char*)(pgData-memberData) sizeof(stMemberData) 3 * sizeof(stPosition));结尾 非常感谢大家的支持在浏览的同时别忘了留下您宝贵的评论如果觉得值得鼓励请点赞收藏我会更加努力 作者邮箱studysenllang.onaliyun.com 如有错误或者疏漏欢迎指出互相学习。 注未经同意不得转载
http://www.dnsts.com.cn/news/209653.html

相关文章:

  • pc下载网站模板想做网站 优帮云
  • 商城网站合同自建站是什么意思
  • 高端自适应网站网站制作 深圳有什么公司
  • 长沙城乡住房建设厅网站wordpress搭建淘宝客
  • 龙岩做网站的地方有哪些都江堰市网站建设
  • 做暧暧前戏视频网站wordpress 投票网站
  • 设计一个小程序需要多少钱合肥seo网站推广费用
  • 招聘网站源码下载自学网站开发条件
  • 公司的网站建设公司虹口建设机械网站
  • php做在线直播网站网站建设销售开场白
  • 企业内部网站建设网站wordpress django
  • 手机网站cms系统亚马逊网站托管怎么做
  • 桓台网站开发桂林行业网站
  • 网络网站排名优化企业做网站需要提交的资料表格
  • 深圳百度seo整站织梦网站模板免费
  • 邹城建网站中国新闻社山西分社
  • 个人网站建设工作室2019年度最火关键词
  • 北京市保障性住房建设投资中心官方网站做微商能利用的网站有哪些问题
  • 文化传媒建设网站没网站怎么做京东联盟
  • 河南网站建设设计广州黄浦区建设局网站
  • 网站宽度设置.net网站架设
  • 迪哥哪个网站上做游戏直播山东网络建站推广
  • 个人域名用来做淘宝客网站长沙网
  • 五星级酒店网站建设做外销网站服务器好吗
  • 一般做网站价格深圳燃气公司地址
  • 兴安盟网站建设效果图专业制作
  • windows2008 iis 网站wordpress图文安装
  • 广州网站制作费用简单手工
  • 网站整站模板下载工具前端为啥不用wordpress
  • 做网站每一步的是什么湖南企业网络推广软件