结构体指针开辟空间的疑惑

求助:结构体指针开辟空间的疑惑
c程序在devc++中运行:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct
{int parent; //父结点序号 
  int left; //左子树序号
  int right; //右子树序号 
  int weight; //权值 
}HuffmanTree;
main()
{HuffmanTree *a;
a=(HuffmanTree *)malloc(sizeof(HuffmanTree));
a[0].weight=12;
a[1].weight=13;
a[8].weight=14;
printf("%d,%d,%d",a[0].weight,a[1].weight,a[8].weight);
system("pause");}
上面的程序运行,得不到结果
但1、改成a=(HuffmanTree *)malloc(2*sizeof(HuffmanTree));就可以 
  2、把int parent; //父结点序号 int left; //左子树序号 int right; //右子树序号 都去掉,不修改a=(HuffmanTree *)malloc(sizeof(HuffmanTree));也可以运行得到结果  
对上面的操作不理解:2*sizeof(HuffmanTree)是开辟了两个空间,但代码里面有a[8]却还能照常运行显示;第二种情况为啥单单去掉int parent; //父结点序号 int left; //左子树序号 int right; //右子树序号 就可以?????求指导

------解决方案--------------------
这种越界访问的代码有什么好解释的。不要拿着运行不崩溃就非得找个不崩溃的理由。错误的代码就是错误的代码。
------解决方案--------------------
用多少分配多少,不要少,你那代码问题太大了
------解决方案--------------------
只开辟了一个HuffmanTree的空间,你使用a[8],a[14],严重越界,能显示才怪.

------解决方案--------------------
你开辟8个就好了...