关于invalid next size (fast)有关问题

关于invalid next size (fast)问题
#include   <stdio.h>

int   main(void)
{
                int   *ip   =   NULL;
                ip   =   malloc   (sizeof   (int));
                *(ip   +   0)   =   1;
                *(ip   +   1)   =   2;
                *(ip   +   2)   =   3;
                //*(ip   +   3)   =   4;
                *(ip   +   4)   =   5;
                printf   ( "%d   -   %x\n ",   *(ip   +   0),   ip   +   0);
                printf   ( "%d   -   %x\n ",   *(ip   +   1),   ip   +   1);
                printf   ( "%d   -   %x\n ",   *(ip   +   2),   ip   +   2);
                printf   ( "%d   -   %x\n ",   *(ip   +   3),   ip   +   3);
                printf   ( "%d   -   %x\n ",   *(ip   +   4),   ip   +   4);
                if   (ip   !=   NULL)
                                free(ip);
}

每每在给ip   + 3这个位置赋值时,会出现invalid   next   size   (fast)。而注释掉这行后便相安无事。
我想问的是,是不是系统在malloc的时候,将所分配内存的档案信息都放在特定的位置?如果是的话,这特定的位置又是如何计算的呢?

------解决方案--------------------
给ip + 3这个位置赋值时不出错,那是你运气好.
你用malloc(sizeof(int))分配了一段空间
int类型的指针ip指向了这段空间,
*(ip+0)=1. 给这段空间赋值,
*(ip+1)=2, ip往后移动一个位置,大小为sizeof(int)个字节,此处,已经是对无效的空间赋值了,没有出错,那是你运气好,