一个简单的指针访问错误

对于几乎没什么工程经验的我来说,找个印象深刻的bug也是一件很难的事情啊。下面还是刚刚接触C语言时候犯过的一个错误,

刚刚接触指针,写了一段代码,通过指针int * pa访问动态数组int *a = (int *)malloc(sizeof(int)*2)。

初始化pa = a;

写了个循环遍历数组时,不想通过下标来访问,而是通过加循环索引idx来遍历,每次循环pa = pa + idx;idx初始化为0,每次循环idx++

for(idx=0;idx<2;idx++){

  pa = pa+idx;

  printf("%d\n",*pa);

}

运行之后没问题。

因为数组大小只有2。

换个稍微大一点的输入,数组就越界了。

这个错误的产生在于代码不规范,其实,循环中pa = a+idx,或者pa++或者干脆使用数组下标来遍历就可以改正这个错误。

如果申请两个连续的堆空间,那么在越界的时候是否会访问到另一个堆空间的值从而造成一些隐患呢?

产生这个想法是因为之前看过的一个关于缓冲区溢出的文章,同样是越界访问,不同只在于读和写的区别以及堆空间和栈空间的区别。

错误虽小,隐患无穷。希望以后自己可以引以为戒。

posted @ 2017-04-25 11:33  Goliath  阅读(192)  评论(0编辑  收藏  举报