道理应该出错了
- #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;
- }
复制代码
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,读取没有报错
这里测试访问不安全内存空间值没有出错,但是你去修改这个就不一定了
|