一个简单的指针访问错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个简单的指针访问错误相关的知识,希望对你有一定的参考价值。

对于几乎没什么工程经验的我来说,找个印象深刻的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++或者干脆使用数组下标来遍历就可以改正这个错误。

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

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

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

以上是关于一个简单的指针访问错误的主要内容,如果未能解决你的问题,请参考以下文章

使用基类函数指针访问派生类成员函数

assertion failed是啥原因?

简单的指针算术问题

Mybatis如何传递多个参数——一个莫名空指针错误引起的思考

指针和引用 - 简单的 CharArray 操作程序

单向链表的简单使用