鱼C论坛

 找回密码
 立即注册
查看: 179|回复: 20

[已解决]数组

[复制链接]
发表于 2021-9-11 16:57:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 梦回连营 于 2021-9-11 17:02 编辑

如第一张图所示,我只声明了一个长度为1的数组,为什么我可以往数组里面放3个数,直到放第4个数的时候才出现问题。
第二张图我只能给数组赋两个值, 当我想赋第三个值(*p = 3)的时候也出现问题。
出现的问题都是没有打印出任何信息。
最佳答案
2021-9-11 23:35:03
首先,你的代码越界了,写到了 数组 a 的后面
数组 a 的后面 不知道是什么
不同的编译器一般不一样,因为有的编译器会选择把变量和变量之间空开几个字节,就是数组越界了,程序也可以继续运行(因为不会覆盖到其他变量)
有的编译器会因为节省空间,把变量紧挨着,这样的代码会覆盖后面的变量,会发生什么 是不确定的,如果覆盖了一个指针,之后又使用了那个指针,程序一般就停止工作了
9——11.png
9_11.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-11 17:11:14 | 显示全部楼层

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-11 17:11:44 | 显示全部楼层
你那报啥错误?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-9-11 17:18:04 | 显示全部楼层

不报错,就直接结束了程序,没有打印出任何东西
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-11 17:30:36 | 显示全部楼层
估计越界到代码段了,第一章图的a[1],a[2]越界后没有影响到代码段的运行,a[3]影响到了。
图二如上
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-11 17:46:00 | 显示全部楼层
梦回连营 发表于 2021-9-11 17:18
不报错,就直接结束了程序,没有打印出任何东西

我这没问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-11 18:13:15 | 显示全部楼层


估计编译器不一样,我这个vs2012,第一章图数组直接报错
error C4789: 缓冲区“a”(大小为 4 字节)将溢出;4 字节将在偏移 12 时开始写入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-11 18:21:20 | 显示全部楼层
jhq999 发表于 2021-9-11 18:13
估计编译器不一样,我这个vs2012,第一章图数组直接报错
error C4789: 缓冲区“a”(大小为 4 字节)将溢 ...

有可能,我是用devc++ 来写的
那应该就是编译器的问题了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-11 18:34:21 | 显示全部楼层
你这个是数组溢出,把其他内存修改了,
你可以把a当成一个指针,由于内存是连续的,所以内存表现如下图

                               
登录/注册后可看大图

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2021-9-11 19:28:53 | 显示全部楼层
2736946915 发表于 2021-9-11 18:34
你这个是数组溢出,把其他内存修改了,
你可以把a当成一个指针,由于内存是连续的,所以内存表现如下图

a[1]的长度不是为1吗, 你画的图是2个吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-11 23:35:03 | 显示全部楼层    本楼为最佳答案   
首先,你的代码越界了,写到了 数组 a 的后面
数组 a 的后面 不知道是什么
不同的编译器一般不一样,因为有的编译器会选择把变量和变量之间空开几个字节,就是数组越界了,程序也可以继续运行(因为不会覆盖到其他变量)
有的编译器会因为节省空间,把变量紧挨着,这样的代码会覆盖后面的变量,会发生什么 是不确定的,如果覆盖了一个指针,之后又使用了那个指针,程序一般就停止工作了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-12 01:45:07 | 显示全部楼层
梦回连营 发表于 2021-9-11 19:28
a[1]的长度不是为1吗, 你画的图是2个吗?

a[1]是2个,a[0]和a[1],是从0开始的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-12 08:40:19 From FishC Mobile | 显示全部楼层
一看 人造人 的回复 就感觉是个高手!感觉人造人不是调试看过函数调用的汇编语言代码,就是学习过相关内容。说的太好了。确实变量之间的空间和编译器有关。也确实编译器对数组和指针变量的越界检查严格程度也不一样。其实大家可以再做一个有趣的实验,如果越界调用,你的编译器不报错,在定义a数组前再多定义几个变量或数组,然后再给a数组多赋值几个,还是可以打印出来。其实你的赋值只要没有覆盖函数返回地址的内存空间,上面的程序一般不会异常中断!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-12 08:43:16 From FishC Mobile | 显示全部楼层
2736946915 发表于 2021-9-12 01:45
a[1]是2个,a[0]和a[1],是从0开始的

就是一个,不是两个。哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-13 21:01:10 | 显示全部楼层
routty 发表于 2021-9-12 08:43
就是一个,不是两个。哈哈

建议你学好基础,西方国家是从0开始数的,0-9是10个,写循环只会写i<10,而不是i<=10.....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-13 21:02:07 | 显示全部楼层
routty 发表于 2021-9-12 08:43
就是一个,不是两个。哈哈

或者你sizeof一下,就知道了,int是4字节,2个元素就是8字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-13 21:21:58 | 显示全部楼层
2736946915 发表于 2021-9-13 21:01
建议你学好基础,西方国家是从0开始数的,0-9是10个,写循环只会写i

int a[2] 有几个元素?这里的2是指个数,代表的元素是a[0],a[1]。这里从0开始是为了指针计算的方便(就是方便计算偏移量),如:a[1]=*(a+1)这个恒等式就是体现了从0开始的方便性。你去看看教材是不是表示三个元素!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-13 21:27:42 | 显示全部楼层
2736946915 发表于 2021-9-13 21:01
建议你学好基础,西方国家是从0开始数的,0-9是10个,写循环只会写i

所以a[10],在循环赋值语句中会写成 i<10,这样就从a[0]到a[9]赋值,刚好10个数。方便!对吧&#128522;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-13 21:29:06 | 显示全部楼层
routty 发表于 2021-9-13 21:21
int a[2] 有几个元素?这里的2是指个数,代表的元素是a[0],a[1]。这里从0开始是为了指针计算的方便(就 ...

好像是了..太久没玩这玩意了...
总的来说你这问题就是溢出,
[]这个东东别填就行,让编译器自己去算多少个,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-9-13 21:54:21 | 显示全部楼层
2736946915 发表于 2021-9-13 21:29
好像是了..太久没玩这玩意了...
总的来说你这问题就是溢出,
[]这个东东别填就行,让编译器自己去算多 ...

长时间不接触有些语法会忘记的,我也是!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1

GMT+8, 2021-9-26 17:32

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表