Well, obviously aloone was talking about overflows (since he mentioned program crashes), despite improper use of terminology. What comes to overloading, there's no such thing in C. There is in C++, but it cannot overload variables, it only applies to operators and function names. So, that's that and hopefully we're through that confusion now.
Also, C# indeed solves the problem, as does the common language runtime of the .NET framework. I'm not kidding anyone when I say .NET isn't C#, it's a framework and runtime environment, and C# happens to be just one language specifically designed for it. However, .NET defines a concept called "verifiable code", which is a set of restrictions that the code must meet to be verifiable. Any code which meets these requirements can be verified to not breach the execution flow, and thus can be verified to not contain buffer overflows and such. Unsafe sections of the code must then be marked as such, and can remain vulnerable, but this allows for greater isolation of such code. Under these restrictions, the language and runtime environment can guarantee that any program errors happen above the logic level, and as of such are isolated to the execution path and are easier to trace.
The typical problem with C and C++ is that a memory error anywhere in the program can cause problems in any other part of the program, so the program might only crash hours or days after the effects of the bug took place. Verifiable code solves this issue, and thus it will simply become impossible to make such bugs. Obviously, this feature doesn't have to be used, which means .NET isn't a magic salt which solves all problems merely by sprinkling it around. It however provides the means for writing such secure code, that isn't suspectible to traditional problems of traditional software development.