I think this is what you're trying to do. In my sample code I've only used one "real data" struct, but I suppose you'll have lots of them. There's a simple diagram to show what's going on as well. It starts with an array of pointers. Each element receives a pointer to a malloc'd area of memory for holding a number of more pointers. These pointers are then given the address of the real data structures.
Code:
/*
[Array Pointer 0]---->[Data Pointer 0]--->[Real Data Item]
                      [Data Pointer 1]--->[Real Data Item]
                      [Data Pointer 2]--->[Real Data Item]
                      [Data Pointer 3]--->[Real Data Item]
                      [Data Pointer 4]--->[Real Data Item]
                      [Data Pointer 5]--->[Real Data Item]

[Array Pointer 1]---->[Data Pointer 0]--->[Real Data Item]
                      [Data Pointer 1]--->[Real Data Item]

[Array Pointer 3]---->[Data Pointer 0]--->[Real Data Item]
                      [Data Pointer 1]--->[Real Data Item]
                      [Data Pointer 2]--->[Real Data Item]
                      [Data Pointer 3]--->[Real Data Item]
                      [Data Pointer 4]--->[Real Data Item]
....                      
[Array Pointer 9]---->[Data Pointer 0]--->[Real Data Item]
                      [Data Pointer 1]--->[Real Data Item]
                      [Data Pointer 2]--->[Real Data Item]
*/

#include <stdio.h>
#include <stdlib.h>

struct Data
{
  int i;
};

struct Data RealData = {1};

int main(void)
{
  struct Data **pSections[10];
  /* Now size for 10 sections */
  int SectionsCount[] = {5, 2, 3, 5, 6, 1, 3, 2, 5, 9}; 
  int i, j;
  
  for (i = 0; i < 10; ++i)
  {
    /* Malloc space for SectionsCount[i] number of pointers */
    pSections[i] = malloc(sizeof(pSections[i])*SectionsCount[i]);
    for (j = 0; j < SectionsCount[i]; ++j)
    {
      pSections[i][j] = &RealData;
    }
  }
  
  for (i = 0; i < 10; ++i)
  {
    for (j = 0; j < SectionsCount[i]; ++j)
    {
      printf ("Main Array item %d, Sub element %d, Value: %d\n", i, j, pSections[i][j]->i);
    }
  }
  
  return 0;
}

/*
Output

Main Array item 0, Sub element 0, Value: 1
Main Array item 0, Sub element 1, Value: 1
Main Array item 0, Sub element 2, Value: 1
Main Array item 0, Sub element 3, Value: 1
Main Array item 0, Sub element 4, Value: 1
Main Array item 1, Sub element 0, Value: 1
Main Array item 1, Sub element 1, Value: 1
Main Array item 2, Sub element 0, Value: 1
Main Array item 2, Sub element 1, Value: 1
Main Array item 2, Sub element 2, Value: 1
Main Array item 3, Sub element 0, Value: 1
Main Array item 3, Sub element 1, Value: 1
Main Array item 3, Sub element 2, Value: 1
Main Array item 3, Sub element 3, Value: 1
Main Array item 3, Sub element 4, Value: 1
Main Array item 4, Sub element 0, Value: 1
Main Array item 4, Sub element 1, Value: 1
Main Array item 4, Sub element 2, Value: 1
Main Array item 4, Sub element 3, Value: 1
Main Array item 4, Sub element 4, Value: 1
Main Array item 4, Sub element 5, Value: 1
Main Array item 5, Sub element 0, Value: 1
Main Array item 6, Sub element 0, Value: 1
Main Array item 6, Sub element 1, Value: 1
Main Array item 6, Sub element 2, Value: 1
Main Array item 7, Sub element 0, Value: 1
Main Array item 7, Sub element 1, Value: 1
Main Array item 8, Sub element 0, Value: 1
Main Array item 8, Sub element 1, Value: 1
Main Array item 8, Sub element 2, Value: 1
Main Array item 8, Sub element 3, Value: 1
Main Array item 8, Sub element 4, Value: 1
Main Array item 9, Sub element 0, Value: 1
Main Array item 9, Sub element 1, Value: 1
Main Array item 9, Sub element 2, Value: 1
Main Array item 9, Sub element 3, Value: 1
Main Array item 9, Sub element 4, Value: 1
Main Array item 9, Sub element 5, Value: 1
Main Array item 9, Sub element 6, Value: 1
Main Array item 9, Sub element 7, Value: 1
Main Array item 9, Sub element 8, Value: 1

*/
[edit]
Also note, my code doesn't show free() and error checking on malloc, which you should be doing