指针访问越界?解决思路

指针访问越界?
C/C++ code

int main()
{
    short *p2 =NULL;
    p2 = (short*)malloc(1000);
    if(NULL == p2)
    {
        return;
    }
    
    p2[900] = 1;

    free(p2);

    system("pause");
    return 1;
}



程序在运行时产生访问访问异常,我想原因应该出现在p2[900] = 1;上。
如果是数组的话p2[900]所处的内存地址应该是900*2=1800,已经越过了所分配的1000,执行语句后指针为1800。下面再调用free(p2)时,由于p2已经移动了1800字节,所以调用free语句会产生异常。不知我分析得对不对,如果不对请高手指正一下。
谢谢!!

------解决方案--------------------
前半部分对,后面说的不对。

free(p2); 没有异常;
就是 p2[900]越界了。
------解决方案--------------------
简单的解释: 数组越界;

实际上我们跟踪代码的运行,发现问题并不在下面的代码中:
p2[900] = 1;

而是发生在:
free(p2);

要说清楚这个问题可能并不容易,但可以给个抛砖引玉的提示:
在p2[900] = 1 这句的操作中改写了不属于程序申请到的内存, 如堆结构信息, 这些信息在free的时候需要用到
------解决方案--------------------
越界了