数组扩张造成的问题

结构体中数组扩张造成的问题

在一个结构体中,我们定义一个数组和一个数据,会不会有那么一种情况使得这个数据的输出并非我们一开始输入的呢?如果会,那又是什么原因呢?
先让我们来看一下下面这个C程序:
在这里插入图片描述
从上面的C程序看来,结构体struct_t中的双精度数d的初始值为3.14。接下来,让我们在LInux下运行该程序:
在这里插入图片描述
在这里插入图片描述
从上面两次运行看来,s.a[0]和s.a[1]被更改对s.d并没有什么影响。
在这里插入图片描述
在这里插入图片描述
而从fun(2)和fun(3)来看,s.d的值就发生了变化,说明我们令s.a[2]和s.a[3]为1073741824时,s.d受其影响,产生了变化。
在这里插入图片描述
更奇怪 的是,s.a[4]的改变并没有对s.d产生影响。这又是为什么呢?
原因
在结构体struct_t中,s.a和s.d的空间排序为
在这里插入图片描述
数组s.a中含有2个元素,因为是int型,所以占8个字节,s.d为double型独占8个字节。故令s.a[0]和s.a[1]为1073741824时,并不影响s.d的值。而对于本不存在的s.a[2]和s.a[3],如果突然要使其产生,则其会接在s.a[1]后,故输入2和3时,产生了s.a[2]和s.a[3],因为其位置会紧接于s.a[1]后,所以d则被覆盖,故d中的数据产生了相应的变化。而s.a[4]的位置在s.d的后面,并不会对s.d的数据产生影响。
总结
当我们在调用结构体中的数组元素时,尽量不要调用我们没有定义的数组元素,否则可能产生其他数据被覆盖的后果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值