吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3061|回复: 25
收起左侧

[讨论] C语言中一个神奇的代码

  [复制链接]
By无邪 发表于 2019-11-5 10:43
反正数组是越界了,但是看代码显示应该是到11的时候就停了,但是因为数组的问题,不知道为啥又循环

QQ图片20191105104244.jpg

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

dazhuangzhuang 发表于 2019-11-5 10:47
数组a之后是i,i的位置正好在a[10]的位置,当a[10]=0以后,相当于i置0
411161555 发表于 2019-11-5 10:50
本帖最后由 411161555 于 2019-11-5 15:18 编辑

问了朋友  越界。
jiujiuzhiyue 发表于 2019-11-5 10:51
lgh520 发表于 2019-11-5 10:53
QQ截图20191105105055.png
就是越界了,如果再越两个个就到了函数返回地址的地方,也就是ebp+4的地方,不知道是不是这样,楼主自测。
mywanghh 发表于 2019-11-5 10:53
int a[10] 是 a[0] ~ a[9],  紧接着存放 int i;
dazhuangzhuang 发表于 2019-11-5 10:57
本帖最后由 dazhuangzhuang 于 2019-11-5 10:58 编辑
411161555 发表于 2019-11-5 10:50
那也是  a[10]=0  跟  i 有什么关系?

自动数组由C的编译器分配内存时,给a数组数组首先分配了10个整数长度的内存空间,紧随其后又分配了1个整数长度的内存给i,由于C语言不进行数组越界检查,导致编译通过,运行时,当i=10的时候,a[10]对应的内存地址在首地址a之后第10个整数长度处的地址,正好是编译器分配的变量i所在的内存地址。正确的数组范围应该是从0到9

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
cube + 1 + 1 我很赞同!厉害厉害.完全没想到.
苏紫方璇 + 1 + 1 用心讨论,共获提升!

查看全部评分

xmlulu 发表于 2019-11-5 10:59
411161555 发表于 2019-11-5 10:50
那也是  a[10]=0  跟  i 有什么关系?

a[10] 在内存中的位置,就是i的位置,所以 i 的值又被赋值成0了
dazhuangzhuang 发表于 2019-11-5 11:04
另外,反汇编后,看数组a和i的关系,就更好理解了
yc19951005 发表于 2019-11-5 11:21
楼上好多大神啊
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-27 00:30

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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