Remember that Array[n] starts at Array and progress up to Array[n-1].
You are accessing Array[n] from Array up to Array[n]... big problem, easy solution. This is why you have one block too many.
Assuming that you are initializing m_block like this: m_block[MAX_BLOCKS], then in your for loop you are actually overwriting past the bounds of the array when (i == MAX_BLOCKS). To fix that, change both of your for loops to increment up to (i < MAX_BLOCKS).
Now your loop will be incrementing from 0 to 399... thats a total of MAX_BLOCKS, instead of MAX_BLOCKS + 1, and you'll stay within the array bounds.
Problem two, which is the reason you have the extra block in the top row, is because you are including 0 in the loop. On your first check at (i % 20), you are actually at loop index of 21 because of starting at 0.
To solve that, simply change the code to check for %20 at i+1.
// add block sprites
for (int i = 0; i < MAX_BLOCKS; ++i)
/* code removed */
if ( !((i+1) % 20) )
xSpacer = 10;
ySpacer -= 20;