title: How are multi-dimensional arrays formatted in memory?
body: <p>In C, I know I can dynamically allocate a two-dimensional array on the heap using the following code:</p>
  
  <pre><code>int** someNumbers = malloc(arrayRows*sizeof(int*));
  
  for (i = 0; i &lt; arrayRows; i++) {
      someNumbers[i] = malloc(arrayColumns*sizeof(int));
  }
  </code></pre>
  
  <p>Clearly, this actually creates a one-dimensional array of pointers to a bunch of separate one-dimensional arrays of integers, and "The System" can figure out what I mean when I ask for:</p>
  
  <pre><code>someNumbers[4][2];
  </code></pre>
  
  <p>But when I statically declare a 2D array, as in the following line...:</p>
  
  <pre><code>int someNumbers[ARRAY_ROWS][ARRAY_COLUMNS];
  </code></pre>
  
  <p>...does a similar structure get created on the stack, or is it of another form completely? (i.e. is it a 1D array of pointers? If not, what is it, and how do references to it get figured out?)</p>
  
  <p>Also, when I said, "The System," what is actually responsible for figuring that out? The kernel? Or does the C compiler sort it out while compiling?</p>