C-c数组中访问过界元素产生的疑惑

发布于 2017-01-27 00:41:16 字数 450 浏览 1474 评论 2

在学习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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

甜柠檬 2017-05-28 18:14:03

首先我要对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 (从此处到 ... 无限循环)』为什么会有无限循环??

偏爱自由 2017-02-02 04:04:07

呵呵,不好意思,可能没有表达清楚。
其实就是一个问题,就是对两个测试代码的每次输出结果解释一下。至于其他的内容,就是我的思路和理解,您可以略过。谢谢!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文