[问题]数组下标越界发现的问题

软件和网站开发以及相关技术探讨
回复
me
帖子: 972
注册时间: 2007-09-14 19:51

[问题]数组下标越界发现的问题

#1

帖子 me » 2007-09-30 11:28

编译下列代码并运行会输出不固定的数字

代码: 全选

#include<iostream>
int main()
{
    int b[7];
    std::cout<<b[7]<<std::endl;
    return 0;
}

但是编译下列代码会并运行会输出:7

代码: 全选

#include<iostream>
int main()
{
    const int a=7;
    int b[a];
    std::cout<<b[a]<<std::endl;
    return 0;
}
把上面的代码中的 a改成什么数字,运行结果就会输出输出什么数字,
why??
谢谢!
头像
yexin218
帖子: 461
注册时间: 2007-08-22 17:36
来自: 澳门
联系:

#2

帖子 yexin218 » 2007-09-30 11:40

#include<iostream>
int main()
{
int b[7];
std::cout<<b[7]<<std::endl;
return 0;
}

应该是访问了没有分配给数组的内存空间。上面的结果中b[7]访问了不属于数组的内存空间,读取了一个无用的值,这个值是以前使用这个内存单元时保存的值。
我很敏捷,我是网上的蜘蛛;我很茫然,我是网中的猎物!
欢迎到我的Blog※代码回音※
me
帖子: 972
注册时间: 2007-09-14 19:51

#3

帖子 me » 2007-09-30 11:42

你没理解我的意思
我的问题在第二个代码上
forcotton
帖子: 57
注册时间: 2006-10-06 21:10

#4

帖子 forcotton » 2007-09-30 11:48

可能 a 正好放在 b[]的后面 。所以b[7] 引用了a的内容。(stack 是倒着长的,所以后面的变量的地址反而小)

如果改变一下编译选项,比如加个 -O,你说的效果可能就没有了。
me
帖子: 972
注册时间: 2007-09-14 19:51

#5

帖子 me » 2007-09-30 11:51

forcotton 写了:可能 a 正好放在 b[]的后面 。所以b[7] 引用了a的内容。(stack 是倒着长的,所以后面的变量的地址反而小)

如果改变一下编译选项,比如加个 -O,你说的效果可能就没有了。
果然是这样
谢谢
tiankunmin
帖子: 38
注册时间: 2007-09-07 3:08

#6

帖子 tiankunmin » 2007-10-01 5:30

这有什么不好理解的?

代码: 全选

int main()
{
    const int a=7;
    int b[a];
    std::cout<<b[a]<<std::endl;
    return 0;
} 
如果当前esp是0x100000
---------asm
push	ebp
mov	ebp, esp
sub	esp, 4			;int a ,a的地址  = esp = 0x0FFFFC
mov	eax, 7			;
mov	SS:[esp], eax		;a = 7
sub	esp, 4 * eax		;int b[a], b 的地址  = b[0]的地址 = esp = 0x0FFFE0
mov	eax, SS:[esp + 4 * eax]	;ebp + 0x1C = 0x0FFFFC = a的地址
...
所以显示的是a的值

至于第一个例子显示的应该是ebp的值,以为在int b[7]前入栈的是ebp
me
帖子: 972
注册时间: 2007-09-14 19:51

#7

帖子 me » 2007-10-01 13:00

可是我看不懂汇编呀
头像
nobrain
帖子: 808
注册时间: 2005-08-25 13:58
来自: ustc
联系:

#8

帖子 nobrain » 2007-10-01 18:27

me 写了:可是我看不懂汇编呀
因为参数是压到栈里面的,栈是从高地址向低地址方向长的,变量在栈里面的分布如下:

高地址
a
b[6]
b[5]
.
.
.
b[0]
低地址
爱喝真猪奶茶的夜鸣猪
头像
stlxv
论坛版主
帖子: 8275
注册时间: 2006-05-03 0:39
来自: المريخ

Re: [问题]数组下标越界发现的问题

#9

帖子 stlxv » 2007-10-02 0:25

me 写了:编译下列代码并运行会输出不固定的数字

代码: 全选

#include<iostream>
int main()
{
    int b[7];
    std::cout<<b[7]<<std::endl;
    return 0;
}

但是编译下列代码会并运行会输出:7

代码: 全选

#include<iostream>
int main()
{
    const int a=7;
    int b[a];
    std::cout<<b[a]<<std::endl;
    return 0;
}
把上面的代码中的 a改成什么数字,运行结果就会输出输出什么数字,
why??
谢谢!
b和a都在堆栈中分配空间。在堆栈的分配中,是往高到低来分配的。在这里,首先往低处给a分配空间,然后紧挨着给b分配空间,这样刚好a就在b的最后(也就是[a]的位置),所以当你用b[a]的时候,它就访问到的是a的值了。
PHP是最好的语言!不服来战!
回复