>> You seem to have used malloc and I have used calloc
Your use of calloc is wrong for two reasons.

1) The first thing you do with the newly allocated memory is put data into in. Therefore, ensuring it's zero (through use of calloc()) is pointless, as you never use the zero value.

2)calloc() sets all memory bits to zero, but this does not guarantee a NULL pointer. There's an entry in the eskimo FAQ about this.

In short, use malloc.

>>sizeof(MyStruct**) instead of sizeof(pSections[i])
Those two are the same in this case, but style rules would recommend that you use whatever you're assigning to in the determination of the size of memory. Looking back at my code, it should have actually been sizeof(*pSections[i]), but this still equates to the size of a pointer, so there's no actual difference.

>>how will the compiler/runtime environment interpret pSections[i][j]
Correctly. pSections is an array, so pSections[i] will take you to a specific element of the array. Dereferencing that takes you to the dynamically created array, which is variable size, and can be indexed through [j]. Using the arrow notation on that address will derefence it again to take you to the real data structure. Hopefully this is what my code showed you.