I think the problem you are encountering here is that C is not really for user-mode applications. Sure you can use it, but C really comes into its own when you start saying things like "We've got this new processor..." or "let's build an OS" or even "I've only got 70KB of memory on this thing, so we can't use .NET", or "let's build the new[] operator without using malloc".
If you're dealing with users in C, you're probably doing it wrong. If you're dealing with raw memory, data and kernel drivers in C++ or C# you're probably doing it wrong.