Of the choices you presented, the 2nd approach is probably best...even a 2d array like, say, video memory is represented in 1 dimension.
The 3rd approach will work fine if you need a 2d array...but an array with any number of dimensions is usually best mapped in 1 dimension and accessed with multiplies or bit shifts.
Alternatively you could allocate 1 block of memory and assign it to a multi-dimensional array like
int *Tmp = new int[10*20];int **myArray = new int*[10]; // maybe (int*) ??for (int Index = 0; Index < 10; Index ++) {myArray[Index] = &Tmp[Index*20];}
That would give you a 2d array in 1 contiguous block.
On a side note...honestly you should probably create some sort of class to do your memory allocations or use STL ... it will save you many moons of debugging.
Cheers
-Scott