梦回连营 发表于 2021-9-11 16:57:03

数组

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

如第一张图所示,我只声明了一个长度为1的数组,为什么我可以往数组里面放3个数,直到放第4个数的时候才出现问题。
第二张图我只能给数组赋两个值, 当我想赋第三个值(*p = 3)的时候也出现问题。
出现的问题都是没有打印出任何信息。

大马强 发表于 2021-9-11 17:11:14

https://static01.imgkr.com/temp/63f25a8f186340308212734bcf7cdd5a.jpg

大马强 发表于 2021-9-11 17:11:44

你那报啥错误?

梦回连营 发表于 2021-9-11 17:18:04

大马强 发表于 2021-9-11 17:11
你那报啥错误?

不报错,就直接结束了程序,没有打印出任何东西

jhq999 发表于 2021-9-11 17:30:36

估计越界到代码段了,第一章图的a,a越界后没有影响到代码段的运行,a影响到了。
图二如上

大马强 发表于 2021-9-11 17:46:00

梦回连营 发表于 2021-9-11 17:18
不报错,就直接结束了程序,没有打印出任何东西

我这没问题{:10_269:}

jhq999 发表于 2021-9-11 18:13:15

大马强 发表于 2021-9-11 17:46
我这没问题

估计编译器不一样,我这个vs2012,第一章图数组直接报错
error C4789: 缓冲区“a”(大小为 4 字节)将溢出;4 字节将在偏移 12 时开始写入

大马强 发表于 2021-9-11 18:21:20

jhq999 发表于 2021-9-11 18:13
估计编译器不一样,我这个vs2012,第一章图数组直接报错
error C4789: 缓冲区“a”(大小为 4 字节)将溢 ...

有可能,我是用devc++ 来写的
那应该就是编译器的问题了

2736946915 发表于 2021-9-11 18:34:21

你这个是数组溢出,把其他内存修改了,
你可以把a当成一个指针,由于内存是连续的,所以内存表现如下图https://z3.ax1x.com/2021/09/11/hzRs4H.png

梦回连营 发表于 2021-9-11 19:28:53

2736946915 发表于 2021-9-11 18:34
你这个是数组溢出,把其他内存修改了,
你可以把a当成一个指针,由于内存是连续的,所以内存表现如下图

a的长度不是为1吗, 你画的图是2个吗?

人造人 发表于 2021-9-11 23:35:03

首先,你的代码越界了,写到了 数组 a 的后面
数组 a 的后面 不知道是什么
不同的编译器一般不一样,因为有的编译器会选择把变量和变量之间空开几个字节,就是数组越界了,程序也可以继续运行(因为不会覆盖到其他变量)
有的编译器会因为节省空间,把变量紧挨着,这样的代码会覆盖后面的变量,会发生什么 是不确定的,如果覆盖了一个指针,之后又使用了那个指针,程序一般就停止工作了

2736946915 发表于 2021-9-12 01:45:07

梦回连营 发表于 2021-9-11 19:28
a的长度不是为1吗, 你画的图是2个吗?

a是2个,a和a,是从0开始的

routty 发表于 2021-9-12 08:40:19

一看 人造人 的回复 就感觉是个高手!感觉人造人不是调试看过函数调用的汇编语言代码,就是学习过相关内容。说的太好了。确实变量之间的空间和编译器有关。也确实编译器对数组和指针变量的越界检查严格程度也不一样。其实大家可以再做一个有趣的实验,如果越界调用,你的编译器不报错,在定义a数组前再多定义几个变量或数组,然后再给a数组多赋值几个,还是可以打印出来。其实你的赋值只要没有覆盖函数返回地址的内存空间,上面的程序一般不会异常中断!

routty 发表于 2021-9-12 08:43:16

2736946915 发表于 2021-9-12 01:45
a是2个,a和a,是从0开始的

就是一个,不是两个。哈哈

2736946915 发表于 2021-9-13 21:01:10

routty 发表于 2021-9-12 08:43
就是一个,不是两个。哈哈

建议你学好基础,西方国家是从0开始数的,0-9是10个,写循环只会写i<10,而不是i<=10.....{:10_277:}

2736946915 发表于 2021-9-13 21:02:07

routty 发表于 2021-9-12 08:43
就是一个,不是两个。哈哈

或者你sizeof一下,就知道了,int是4字节,2个元素就是8字节

routty 发表于 2021-9-13 21:21:58

2736946915 发表于 2021-9-13 21:01
建议你学好基础,西方国家是从0开始数的,0-9是10个,写循环只会写i

int a 有几个元素?这里的2是指个数,代表的元素是a,a。这里从0开始是为了指针计算的方便(就是方便计算偏移量),如:a=*(a+1)这个恒等式就是体现了从0开始的方便性。你去看看教材是不是表示三个元素!

routty 发表于 2021-9-13 21:27:42

2736946915 发表于 2021-9-13 21:01
建议你学好基础,西方国家是从0开始数的,0-9是10个,写循环只会写i

所以a,在循环赋值语句中会写成 i<10,这样就从a到a赋值,刚好10个数。方便!对吧&#128522;

2736946915 发表于 2021-9-13 21:29:06

routty 发表于 2021-9-13 21:21
int a 有几个元素?这里的2是指个数,代表的元素是a,a。这里从0开始是为了指针计算的方便(就 ...

好像是了..太久没玩这玩意了...
总的来说你这问题就是溢出,
[]这个东东别填就行,让编译器自己去算多少个,

routty 发表于 2021-9-13 21:54:21

2736946915 发表于 2021-9-13 21:29
好像是了..太久没玩这玩意了...
总的来说你这问题就是溢出,
[]这个东东别填就行,让编译器自己去算多 ...

长时间不接触有些语法会忘记的,我也是!
页: [1] 2
查看完整版本: 数组