能力值:
( LV4,RANK:50 )
|
-
-
2 楼
main也是一个函数。函数里面的变量统称局部变量,函数外面的叫全局变量。顾名思义。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
一个只在函数里面起作用,
一个在整个源文件里面都起作用,还能被其他的源文件引用!
|
能力值:
( LV7,RANK:140 )
|
-
-
4 楼
二楼和三楼说的对,一个是全局,一个是局部。
然而你出现的问题并不是因为全局和局部的区别,而是因为output数组越界。
第一个会出错是正常的,因为越界了。
第二个不出错只能说是你运气好,因为越界了。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
你两个里面的 i判断条件有问题。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
其实目的就是要他越界,但是为什么第二个不出错呢?搞不懂
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
什么问题?
|
能力值:
( LV3,RANK:30 )
|
-
-
8 楼
因为第二个的栈足够大,把name的一部分覆盖掉了。如果非DEBUG模式,不会崩溃。DEBUG版本因为有越界检测,会出一个断言
|
能力值:
( LV7,RANK:140 )
|
-
-
9 楼
总的来说,两者都存在一个缓冲区溢出的问题,溢出之后覆盖了栈。
第一个覆盖的栈区导致ret的返回地址被覆盖了,所以出错。
第二个覆盖的是name的内存区域,所以程序不会崩溃,但是name的内容肯定是改变了。
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
谢谢。
是不是说可以这样理解,在main外面定义和里面定义,所分配的内存中的地址是不一样的?所以覆盖的地方也不一样?
|
能力值:
( LV7,RANK:140 )
|
-
-
11 楼
差不多这个意思吧
|
能力值:
( LV12,RANK:380 )
|
-
-
12 楼
楼上说的对
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
仔细想想,也不对
位置不同的是name这个参数,而output的位置没变(都是在main里面定义的);
而这里是使用name来覆盖output的,也就是说,name的位置变不变跟output没关系啊?为什么两次返回的结果不同呢?
举个例子,name相当于女朋友,main外面定义的name相当于北京的女朋友,main里面定义的name相当于上海的女朋友,但是我(相当于output)一直是我,没变过(一直都是在main里面定义的),为什么上海的女朋友来我家就愿意跟我打啵,北京的女朋友来我家就不愿意呢?(外面的name覆盖output会报错,里面的name覆盖output就不会报错)
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
这例子好像不太恰当。。。。但各位应该能明白我意思吧
|
能力值:
( LV13,RANK:240 )
|
-
-
15 楼
影响其实有很多。这个和编译器以及优化方式有关。你换编译器编译。可能第二个又出错了。
你的
你的name若在里面
char name[]
char output[8];
name和output是连在一起的一块内存
假设栈name地址比output高那么往output里面写。溢出就覆盖了name的前面部分。这时候不会崩溃。
假设name地址比output低。你写溢出就覆盖了返回的eip就崩溃。
在外面的话如果覆盖了eip 一定崩溃
具体反汇编看一起才能确定是什么情况。我用VS2008测试。都会崩溃
|
能力值:
( LV7,RANK:140 )
|
-
-
16 楼
橘生淮南则为橘,生于淮北则为枳。
建议debug编译第二个代码,在调试状态观察一下name的内存变化。
这种问题别人告诉你的,你未必能理解。还是要自己观察一下才明白。
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
这个例子。。。。。这问题反汇编一下就知道问题
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
[QUOTE=IamHuskar;1417082]影响其实有很多。这个和编译器以及优化方式有关。你换编译器编译。可能第二个又出错了。
你的
你的name若在里面
char name[]
char output[8];
name和output是连在一起的一块内存
假设栈name地址比output高那么往output里面写。溢出就覆盖了...[/QUOTE]
感谢! 这下明白了!
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
ALT+8
|
|
|