Something is overlooked. Note that:<p><pre><code> int *a[] = { 1, 2, 3 }
</code></pre>
violates a constraint in the C language; an ISO C conforming implementation must issue a diagnostic --- and, additionally, it may stop translating and reject the program.<p>Why? Because expressions of type int are being used to initialize elements of type pointer to int, without a cast.<p>The first step is operating your compiler such that you get the required diagnostics out of it, or at least the important ones, and then some. For instance, with gcc:<p><pre><code> # C90
gcc -Wall -ansi ... # some would add -pedantic
# C99
gcc -Wall -std=c99 ...
</code></pre>
and then, don't ignore diagnostics that are "mere" warnings!<p>And, of course, passing a pointer argument to a "%d" conversion specifier in printf is undefined behavior.