鱼C论坛

 找回密码
 立即注册
查看: 2431|回复: 4

指针越界后为什么没有报错,怎么跳出循环的啊

[复制链接]
发表于 2018-7-14 10:58:52 | 显示全部楼层 |阅读模式

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

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

x
void f(int *x,int *y)
{
int t;
t=*x;*x=*y;*y=t;
}
main()
{
int a[8]={1,2,3,4,5,6,7,8},i,*p,*q;
p=a;q=&a[7];
while(*p!=*q){f(p,q);p++;q--;}
for(i=0;i<8;i++) printf("%d,",a[i]); 
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-14 11:20:52 | 显示全部楼层
不知道你用的什么编译器,反正我用vc6报错了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-14 16:27:27 | 显示全部楼层
有些编译器不会报错,我的就没有报错,但程序中while确实是构成了死循环,一旦运行程序就会出错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-14 22:21:49 | 显示全部楼层
道理应该出错了
#include <stdio.h>
void f(int *x,int *y){
        int t;
        t=*x;
        *x=*y;
        *y=t;
}
int main(void){
        int a[8]={1,2,3,4,5,6,7,8};
        int i=0;
        int *p,*q;
        p = (int *)124545;        //0x1e681
        printf("%p *p=%d\n",p,*p);
        p=a;q=&a[7];
        printf("开始地址:%p 结束地址:%p\n",p,q);
        while(*p!=*q){
                printf("第%d次 %d %d %p %p\n",++i,*p,*q,p,q);
                f(p,q);
                p++;
                q--;
/*                1.        1,2,3,4,5,6,7,8  8,2,3,4,5,6,7,1
                2.        8,2,3,4,5,6,7,1  8,7,3,4,5,6,2,1
                3.        8,7,3,4,5,6,2,1  8,7,6,4,5,3,2,1
                4.        8,7,6,4,5,3,2,1  8,7,6,5,4,3,2,1
                5.        8,7,6,5,4,3,2,1  8,7,6,4,5,3,2,1
                6.        8,7,6,4,5,3,2,1  8,7,3,4,5,6,2,1
                7.        8,7,3,4,5,6,2,1  8,2,3,4,5,6,7,1
                8.        8,2,3,4,5,6,7,1  1,2,3,4,5,6,7,8
                9.        超出范围 
                10. 超出范围
                .... 
*/        
        }
        for(i=0;i<8;i++) 
                printf("%d,",a[i]);        
                
        return 0;
}
2.gif
2323.png
dev-c++测试
p = (int *)124545;        //0x1e681,这条我就强制访问一个地址,也没有报错
while(*p!=*q)  循环第9次时已经超出数组范围,你不仅读取还执行修改。超出了系统给你分配的使用空间,这样使用上不安全。报错和不报错都不一定,推论如下
比如:???? ?? ??  00 00 00 01  00 00 00 02 ..... 00 00 00 08 ?? ?? ?? ?? 这样的内存存储分配    ??数据值都是随机的
            11 11 11 11  00 00 00 01  00 00 00 02 ..... 00 00 00 08  11 11 11 11

说不一定 前面的问号数据和后面的问号数据是相等的呢。
那么执行完第8次循环后,取超出的前后数据比较,结果相等,退出循环,这样就不会报错了。p = (int *)124545;        //0x1e681,读取没有报错

3.png
这里测试访问不安全内存空间值没有出错,但是你去修改这个就不一定了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-14 22:43:46 | 显示全部楼层
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-30 02:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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