C语言小知识

您所在的位置:网站首页 c语言弹性数组 C语言小知识

C语言小知识

2024-04-05 21:19| 来源: 网络整理| 查看: 265

文章目录 前言一、这篇文章说的是什么(有基础的可以不看)它有什么用? 二、使用结构体中的灵活数组的陷阱总结本文仅限于学习

前言

众所周知,C语言有各种各样神奇的小知识,今天我又和学长学到了c语言的小知识c99的标准“将数组作为结构体的成员进行声明时元素个数可以不定义(只需要写[])”

一、这篇文章说的是什么(有基础的可以不看)

首先相信看这一段的人和作者一样,都是有点懵,属于接触c语言不算很长时间的人或者基础不算很扎实的人,因为在我们正常c语言定义数组是必须标明元素的个数的,就例如int a[5];类似于这样,当我们的结构体要用到数组要不就是确定数组大小,要不就是使用指针动态申请内存空间,最后释放。 但是在C99标准中新引入了“将数组作为结构体的成员进行声明时元素个数可以不定义(只需要写[])”,注意一定要是C99标准(C11标准是否兼容我就没有查了,有知道的可以评论区告诉博主一下),C89标准一定是不行的。 这到底是是个什么玩意呢? 他其实就是数组先不确定大小,然后再将来的程序中如果那里有问题可以直接添加而不用整个程序重写。下面先看看三种不同的定义方法吧,相信前两者大家都很熟悉了。

代码如下:

#define MAX 50; struct apow { int a ; char b; struct pow *next; int w[MAX];//开辟50个元素的数组 };//直接确定数组大小 struct pows { int a; char b; struct pows *next; int *w; };//动态开辟内存空间 struct pow { int a ; char b; struct pow *next; int w[]; };//将数组作为结构体的成员进行声明时元素个数可以不定义(只需要写[]) 它有什么用?

众所周知,我们在改良一种技术的时候,所出现的新技术必然有它的用武之地,如果没有那就当我没说吧。hhh 好了言归正传,它出现的意义是什么?为什么要有它?作者目前知道的作用暂时就一个(如果大家还知道什么作用欢迎评论区给博主普及一下)为了程序的维护和书写方便。为什么这么说呢?当我们如果使用一个确定大小的数组的时候,就有一个问题,数组开多大?如果这是我们提前知道的,那就很开心了。但是如果不知道呢?我们开的很大那会浪费我们宝贵的内存空间(如果大家是在计算机或许没有感觉,但是如果是单片机,特别是那种便宜的几KB的ram),如果开的小了,就会出现程序存不下不够跑了,完了,要重新写了,这样的情况。当然这里有人要说了,我可以使用动态分配内存空间啊,同样的道理首先你如果开辟的不够那么你就需要重新开辟,如果太大那也不行;而且动态分配内存空间比起数组要慢一些。所以,它的出现也算是帮助了我们,当我们不知道自己到底要使用多大数组时,我们就可以使用它了。或者当我们后期程序要维护的时候,出现数组不够的时候我们不要重新开辟,而是直接使用。它的使用方法和普通的数组使用方法基本一致,就是存储方式可能不太一样,下文我们会提到。 当然了,虽然它很好,但是也有它的缺点和陷阱。

二、使用结构体中的灵活数组的陷阱

这种数组的使用方法和普通结构体中的数组使用方法是一致的,这里就不多啰嗦了。重点是它的陷阱。 先给大家看一段代码。

代码如下:

#include struct pow { int a ; char b; struct pow *next; int w[]; }; int main(){ struct pow mypow; printf("pow.a=%d,pow.b=%d,pow.next=%d,pow.w=%d,mypow=%d\n",sizeof(mypow.a),sizeof(mypow.b),sizeof(mypow.next),sizeof(mypow.w[0]),sizeof(mypow)); }

请添加图片描述 这是作者运行的结果(我用的是32位端,你如果用64位结果可能不同),在这里就有个问题,我的结构体大小为什么是12位,如果说结构体中的变量a,b,next按照字节对齐的计算方法计算结构体那么他应该就是12位,那么问题来了,我的w[]数组存在了那里?因为我的结构体只有12个字节大小。 起初我的推测是因为结构体是动态的,此时因为数组的大小是0所以我测的过程中结构体是12个字节的大小,因此我做了如下改进。

#include struct pow { int a ; char b; struct pow *next; int w[]; }; struct pows { int a; char b; struct pows *next; int *w; }; int main(){ struct pow mypow; for(int i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3