A Rust Developer Learns C: Null-Terminated Strings, Magic Integers, and Raw Pointers
C for Rust Programmers

A Rust programmer documents the quirks of C: booleans only became primitive in C23, strings rely on null terminators, integer widths vary by platform, and error handling depends on magic return values and errno. Arrays decay to pointers when passed to functions, and raw pointers replace references, leading to buffer overflows and out-of-bounds writes. The author argues for encoding requirements in the type system so the compiler can catch mistakes.
C places full trust in the programmer to do things right™ and gives few facilities for contracts or safe abstractions.