It seems to me that the problem with "memory safe" languages, is that all the libraries and run-time support has to be memory-safe as well. That tends to make such languages either very large and difficult to implement (like Ada or Java), or (and/or?) ... unable to do the things that need to be done (USB support being a fine example, I guess.)
C has the advantage that it CAN do anything; just set a pointer to your hardware registers and off you go! And it doesn't HAVE to do anything in the language; write a few basic math functions and a bit of startup code, and you can say you have a C compiler (POSIX and LIBC be damned!)
Java:C languages is like digital:analogue circuits.
Typical applications are large programs, and the the interaction between all parts is too complex to understand. The runtime support is much smaller and more constrained, and should therefore have interactions and be easier to understand.
That basic principle occurs in many places, e.g. the difference between analogue and digital circuits. Analogue circuits can do every thing digital circuits can and more, but guess which allows more complex systems. In addition, many people forget that digital circuits are analogue circuits operating in a constrained mode - usually, until so something subtle bites them. Simple example: DRAM - analogue or digital? Which is more usable?
If you think C (worse C++) is a simple language, then you really don't understand the subtleties. In the 90s compiler writers frequently had to ask what the standard meant - and conflicting answers from different committee members. Disgraceful.
Java is a much simpler language.