指针越界后为什么没有报错,怎么跳出循环的啊
void f(int *x,int *y){
int t;
t=*x;*x=*y;*y=t;
}
main()
{
int a={1,2,3,4,5,6,7,8},i,*p,*q;
p=a;q=&a;
while(*p!=*q){f(p,q);p++;q--;}
for(i=0;i<8;i++) printf("%d,",a);
} 不知道你用的什么编译器,反正我用vc6报错了。 有些编译器不会报错,我的就没有报错,但程序中while确实是构成了死循环,一旦运行程序就会出错 道理应该出错了
#include <stdio.h>
void f(int *x,int *y){
int t;
t=*x;
*x=*y;
*y=t;
}
int main(void){
int a={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;
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,88,2,3,4,5,6,7,1
2. 8,2,3,4,5,6,7,18,7,3,4,5,6,2,1
3. 8,7,3,4,5,6,2,18,7,6,4,5,3,2,1
4. 8,7,6,4,5,3,2,18,7,6,5,4,3,2,1
5. 8,7,6,5,4,3,2,18,7,6,4,5,3,2,1
6. 8,7,6,4,5,3,2,18,7,3,4,5,6,2,1
7. 8,7,3,4,5,6,2,18,2,3,4,5,6,7,1
8. 8,2,3,4,5,6,7,11,2,3,4,5,6,7,8
9. 超出范围
10. 超出范围
....
*/
}
for(i=0;i<8;i++)
printf("%d,",a);
return 0;
}
dev-c++测试
p = (int *)124545; //0x1e681,这条我就强制访问一个地址,也没有报错
while(*p!=*q)循环第9次时已经超出数组范围,你不仅读取还执行修改。超出了系统给你分配的使用空间,这样使用上不安全。报错和不报错都不一定,推论如下
比如:???? ?? ??00 00 00 0100 00 00 02 ..... 00 00 00 08 ?? ?? ?? ?? 这样的内存存储分配 ??数据值都是随机的
11 11 11 1100 00 00 0100 00 00 02 ..... 00 00 00 0811 11 11 11
说不一定 前面的问号数据和后面的问号数据是相等的呢。
那么执行完第8次循环后,取超出的前后数据比较,结果相等,退出循环,这样就不会报错了。p = (int *)124545; //0x1e681,读取没有报错
这里测试访问不安全内存空间值没有出错,但是你去修改这个就不一定了
页:
[1]