I go as far back as you; I used Turbo C and wrote TSRs. I never wrote a virus though. I wrote an IDE for the Color Computer 3 in 6809 assembly language, generating make files and all-in-one development before I ever earned a penny as a coder.
C did not encourage bad programming, C allowed bad programming. It was possible to cast almost anything to almost anything else. That didn't mean you had to.
I remember stuff like
if (!strcmp(str1,str2))
clutter and all, as a cooooool way to do struing comparison. Since everyone knew that zero meant equal strings and the ! operator tested for zero, they did unreadable junk like that. It didn't mean you had to.
Throw allows all kinds of malpractice too. It should never have been exposed to developers; just as ! was used to test for string equality, throw was used to save a few minutes of typing instead of changing void functions to return errors.
It's not the languages. It's the sloppy coders trying to be clever.