One of the goals of modern language design (a class of which C is not a
member) is to eliminate the concept of undefined behavior. It is a
necessary evil in C and assembler (and similar), but it is never
desirable.
This is said as though it's self-evident, but it's not
even clear that it's true, let alone self-evident. There
are times when safe languages are perfectly appropriate;
there are other times when it's important to have an
unsafe language, for example for things like writing
operating systems.
One of the primary goals of, to pick two unreleated but
similar examples, the 'D' programming language and 'C#' (and CLR
languages in general) was to make it that any legal syntax has one and
only one possible meaning. I.e., in the words of the 'D' implementor,
it is either correct or it isn't - none of this "in between" stuff
that characterizes C.
Note that D is not a safe language -- it has unchecked
pointers just like C does.
Now, you may agree with this or not, but the point is that that is what
the designers of these languages set out to do.
Newer languages often are designed to be safe because
there isn't much need for another unsafe language.
Either C or C++, depending on one's druthers, fill
almost all the needs of the demand for unsafe
languages. It would be quite a different story if
C and C++ didn't exist, and operating systems were
still being written in assembly language -- then there
would be an explosion of unsafe "systems programming"
languages, as indeed there was before C came on the
scene.
It's because C is so successful as an unsafe language that
newer languages tend to be designed as safe languages.
There being a successful unsafe language is necessary so
other language designers can focus on doing the safe parts
of programming languages, ignoring the unsafe parts because
those can always be done in C.