鱼C论坛

 找回密码
 立即注册
查看: 4677|回复: 12

数组的漏洞

[复制链接]
发表于 2012-10-10 17:26:28 | 显示全部楼层 |阅读模式

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

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

x
C语言并不检查数组下标是否越界,虽然提高了程序运行效率,但有时难免出现些异常。代码如下
#include <stdio.h>
int main()
{
int i;
int a[3]={1,2,3};
for(i=1;i<=3;i++)
{
  a[i]=0;
  printf("a[%d]=%d\n",i,a[i]);
}
return 0;
}
======================================================
运行结果竟然陷入死循环。具体的原因我有一点地方没有理解。
书上的解释是:
      假设计算机为变量i分配的内存位置为0x0013ff7c,数组a中各元素所分配的内存位置如下:
      a[0]地址:0x0013ff70
      a[1]地址:0x0013ff74
      a[2]地址:0x0013ff78
当i=1 时,a[1]的值为0; i 自增运算后的值为2,a[2]的值为0;i再次自增运算后的值为3,此时
程序将找到数组元素a[3]所在的内存位置(0x0013ff7c),并写入0,从而导致变量i的值为0,
然后就无限循环下去了。。。
===============================================
===============================================
    问题:我就是不明白为什么数组a[3]的内存位置是变量i的内存位置0x0013ff7c?
===============================================
===============================================
求大神们帮我解释下下吧。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-10 18:45:29 | 显示全部楼层
我的调试结果:
Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted.

不是死循环。i也没有变为0,只是a[3]==0了。然后就栈溢出,不让运行了。
我用的VC2010.
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-10 18:47:11 | 显示全部楼层
书上的解释可能是基于变量的存储顺序和小端存储的原因。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-10 21:56:25 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-10 21:57:24 | 显示全部楼层
多线程 发表于 2012-10-10 21:56
那个有一句代码写错了  不是a=o  而是a=0

a[i]=0                            a 方括号i方括号 =0
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-10 23:00:04 | 显示全部楼层
多线程 发表于 2012-10-10 21:57
a=0                            a 方括号i方括号 =0

我说的就是a[i]=0的调试结果。a=0根本连编译都过不了。

补充内容 (2012-10-10 23:01):
‘a[i]=0’
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-11 15:59:36 | 显示全部楼层
因为a[3]的地址,比a[2]又加了4个字节
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-11 17:22:02 | 显示全部楼层
呵呵,a【3】和i一个地址,这是写为0 ,i也变为0,当然自增后又变为1了,肯定会进入死循环啊,这看各个编译器的,各个编译器又不一样。最好不要做这种事,
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-11 17:22:43 | 显示全部楼层
在vc里面就会直接内存不能为read
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-11 17:46:20 | 显示全部楼层
能编译通过吗  a是数组名 然后你 a=0~~~~
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-11 17:47:36 | 显示全部楼层
定义了 int a[3] 能使用的就只有 a[0] a[1] a[2] 没有a[3] 这个已经是数组越界了
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-11 18:23:09 | 显示全部楼层
具体可参考《C陷阱与缺陷》P46:如果编译这段程序的编译器按照内存地址递减的方式来给变量分配内存,那么数组a之后的那一个机器字实际上是分配给了整型变量i
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-10-12 11:35:15 | 显示全部楼层
楚门 发表于 2012-10-11 18:23
具体可参考《C陷阱与缺陷》P46:如果编译这段程序的编译器按照内存地址递减的方式来给变量分配内存,那么数 ...

:lol   :handshake 嗯嗯
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-15 12:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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