C-c数组中访问过界元素产生的疑惑
在学习c时,发现c是事先要声明数组大小,否则访问超过大小的数组会出现不容易发现的错误。于是决定测试一下访问过界数组的元素看看有什么后果。
运行环境 size(int) = 4;
代码如下test2.c
#include <stdio.h>
main(){
int a[2];
int i;
for (i = 0; i < 10; i++){
printf("befer the assign -- %d %d n", i, a[i]);
a[i] = 12;
printf("after the assign -- %d %d n", i, a[i]);
}
return 0;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
首先我要对time同学说声抱歉,我很认真地把你的问题看了3遍以上,但是还是没看懂你在说什么。但是好在你的程序我看懂了。就随便说下我的理解吧。
int a[2];
这句话有两个意思:
1. int a[2] 基本等效于 int *const a = (int *)malloc(sizeof(int) * 2); // 请忽略内存中的位置;一个是在stack上分配,一个在堆上。我举这个例子只是为了说明数组名就类似于一个 int型的常量指针。a[2] 等价于 *(a+2)
2. 同时,这句话也暗示编译器,在做数组的下标操作时需要4个字节4个字节来移动指针。如果是char型数组,那就是1个字节1个字节来。
for循环做的事就是
*(a+0) = 12;
*(a+1) = 12;
*(a+2) = 12;
...
*(a+9) = 12;
因为a+1之后越界了,所以写入后面的地址很有可能会abort退出(碰到被保护的地址)。
『after the assign -- 1 1 (从此处到 ... 无限循环)』为什么会有无限循环??
呵呵,不好意思,可能没有表达清楚。
其实就是一个问题,就是对两个测试代码的每次输出结果解释一下。至于其他的内容,就是我的思路和理解,您可以略过。谢谢!