鱼C论坛

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

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

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

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

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

x
  1. void f(int *x,int *y)
  2. {
  3. int t;
  4. t=*x;*x=*y;*y=t;
  5. }
  6. main()
  7. {
  8. int a[8]={1,2,3,4,5,6,7,8},i,*p,*q;
  9. p=a;q=&a[7];
  10. while(*p!=*q){f(p,q);p++;q--;}
  11. for(i=0;i<8;i++) printf("%d,",a[i]);
  12. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-7-14 11:20:52 | 显示全部楼层
不知道你用的什么编译器,反正我用vc6报错了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2018-7-14 22:21:49 | 显示全部楼层
道理应该出错了
  1. #include <stdio.h>
  2. void f(int *x,int *y){
  3.         int t;
  4.         t=*x;
  5.         *x=*y;
  6.         *y=t;
  7. }
  8. int main(void){
  9.         int a[8]={1,2,3,4,5,6,7,8};
  10.         int i=0;
  11.         int *p,*q;
  12.         p = (int *)124545;        //0x1e681
  13.         printf("%p *p=%d\n",p,*p);
  14.         p=a;q=&a[7];
  15.         printf("开始地址:%p 结束地址:%p\n",p,q);
  16.         while(*p!=*q){
  17.                 printf("第%d次 %d %d %p %p\n",++i,*p,*q,p,q);
  18.                 f(p,q);
  19.                 p++;
  20.                 q--;
  21. /*                1.        1,2,3,4,5,6,7,8  8,2,3,4,5,6,7,1
  22.                 2.        8,2,3,4,5,6,7,1  8,7,3,4,5,6,2,1
  23.                 3.        8,7,3,4,5,6,2,1  8,7,6,4,5,3,2,1
  24.                 4.        8,7,6,4,5,3,2,1  8,7,6,5,4,3,2,1
  25.                 5.        8,7,6,5,4,3,2,1  8,7,6,4,5,3,2,1
  26.                 6.        8,7,6,4,5,3,2,1  8,7,3,4,5,6,2,1
  27.                 7.        8,7,3,4,5,6,2,1  8,2,3,4,5,6,7,1
  28.                 8.        8,2,3,4,5,6,7,1  1,2,3,4,5,6,7,8
  29.                 9.        超出范围
  30.                 10. 超出范围
  31.                 ....
  32. */       
  33.         }
  34.         for(i=0;i<8;i++)
  35.                 printf("%d,",a[i]);       
  36.                
  37.         return 0;
  38. }

复制代码

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
这里测试访问不安全内存空间值没有出错,但是你去修改这个就不一定了

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-14 22:43:46 | 显示全部楼层
1.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 19:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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