Practice. Practice. Hands-on Practice.
You probably can compare games programming to being a medical doctor: You can know all the theory, but until you have experienced staying long hours trying to diagnose the root of unrelated symptoms in order to fix a life-threatening problem, you can't say you are a doctor.
Same thing (though maybe not as dramatic) applies to games programming.
Yes, we have the guys fresh out of college that finished all their classes with an A+, know all the theory for figuring out if an algorithm is O(n log n) or O(log n), had a semester with functional languages and took some business classes too, who can't figure out what a bitfield is.
Until you have been trying to diagnose a memory overwrite, tried to track a bad pointer, tried to figure out where the memory leak was caused, you really need to get more practice.
The only way to get this is skills, is to write your own programs, write both high and low level stuff, fix any roadblocks you find, profile your code and try to optimize it.
So here are some ideas for practicing on your own code:
- Write your own stl-like classes: vector, list, map, stack. Clean them up so the interface is easy to use, and then optimize them. Check for memory leaks.
- Write programs to parse different kinds of text files, like INI files, CSV files, etc.
- Write an XML parser from scratch, only using the standard C runtime.
- Write a program that parses simple math expressions (a calculator). Expand it so you can use and save variables.
- Write you own standard C runtime library.