I saw some truths in the popular thread below "why new programming students aren't fairing well." I am currently in an online MSCS program, but my undergrad is in Aero Eng and not CS. Because of my different BS, in order to get into the MS program, I had to illustrate a very basic understanding of C, Java, and data structures. Of the 3 of those, I am definitely the weakest on C. Most of the rest of my MS program focuses on much higher level things (Databases, AI, etc), and although I passed the entrance requirements for C, I certainly do not feel like I understand it well enough for my own satisfaction. I feel as though I will never get a better education on the lower level stuff unless I chase it down on my own (since my MS just keeps focusing "higher"). I have had friends who are software developers say I can build a whole career on high level stuff only, and even if that is true, I am somebody who likes to understand things from the ground up, and right now my questions about C make me feel inadequate as a software-developer-to-be.

I'm almost finished with my 2nd run through the K&R and am getting very good at the syntax for even the typical "difficult issues" such as pointers. However, one thing I've learned in all my frustration is that understanding pointers and the other tough parts of C requires understanding the physical side of what the code is actually doing. Memory allocation, stack, heap, memory leaks, etc... to me they all seem very important, and I only have a very vague understanding of how it all works... and K&R doesn't really touch on any of that. One question that always sticks out in my mind is why, historically, did programming evolve to use stack and heap in the way that it does? Surely it's not the only implementation that would work, but it is the one that has stuck. What little I do know about these issues, I've picked up from forum threads here, stackoverflow, and random tutorial websites. I'd like to read some kind of text though that presents a much more comprehensive look at the physical side of C, if that makes any sense. Can anybody point me in a good direction?

Thanks!