Beaten, but may still be of use. caroundw5h, the code is valid.
This declares an array of pointers to struct ot_entry. These pointers do not point to allocated memory and an attempt to dereference one will result in very bad things.
struct ot_entry *optbl[OT_SIZE];
This allocates enough memory for a struct ot_entry and assigns its address to a pointer variable for later use.
optbl[ot_count] = malloc ( sizeof ( struct ot_entry ) );
Arrays can be extremely confusing. Thumper333's code is the array equivalent to:
int* p; /* Declare a pointer. Does not point to valid memory at this point. */
p = malloc(sizeof(int)); /* Allocate enough memory for an int and assign its address to p. */