Hope this wasn't posted before (just read through very quickly), but I think what is very important when you have to work with C, is to know about the machine representation of data. For example: IEEE 754 floating point numbers, big vs little endian, alignment of structs (here: Windows vs Linux)...
To practice this, it is very useful to make some bit-puzzles (solving some problems without using a any functionality then printf to print the result, a limited number of variables and some logical operators).
Also it is often useful to have a basic knowledge about how a linker works, how the whole compiling process works etc.. But especially understanding the linker (without that, it is so hard to find some kind of errors...)
The book which helped me most to improve my C and C++ skills was: http://www.amazon.com/Computer-Systems-Programmers-Randal-Bryant/dp/013034074X
I think that a deep knowledge about computer architecture makes the difference between a good and a bad C programmer (or at least it is a significant factor).