When you use a dynamically typed language you have CHOSEN to live without those concerns -- you traded checking for flexibility.
In a statically typed language, where you already made the effort of using types, it would be a shame for your program to die or cause havoc because you didn't also think about enforcing some invariants.
Plus, those kind of errors in C can cause buffer overflows, privilege escalation and such.
In a dynamic language it's usually just a halt and a stack-trace.
(And actually there is a move to do exactly what you say --add type checks in dynamic languages. See Dash and Typescript, with their optional type annotations and checks. But if it was possible to optionally have those checks by pure inference, without adding anything to a dynamic language's syntax, most people would jump at it instantly).
In a statically typed language, where you already made the effort of using types, it would be a shame for your program to die or cause havoc because you didn't also think about enforcing some invariants.
Plus, those kind of errors in C can cause buffer overflows, privilege escalation and such.
In a dynamic language it's usually just a halt and a stack-trace.
(And actually there is a move to do exactly what you say --add type checks in dynamic languages. See Dash and Typescript, with their optional type annotations and checks. But if it was possible to optionally have those checks by pure inference, without adding anything to a dynamic language's syntax, most people would jump at it instantly).