To me a big mistake in C is its multidimensional arrays. For example, it is not possible to write a function which multiplies two rectangular matrices, since the sizes cannot vary in that manner (m×n and n×k, with m, n, and k variable).
On the other hand, C has so many goodies which ought to be done right and better in modern languages, but often are not:
1. Variadic functions like printf. It sucks to wrap arguments into a list just for this.
2. Setjmp/longjmp and nonlocal returns
3. Union data types
4. Conditional macro directives to compile debug statement versions when needed.
It's easy to criticise C or patronise it saying that it was good for its time, the reality is that many of its features (or what they attempt) are futuristic even today.
I don't think variadic functions are uncommon. Try Idris - not only it has them, but you can actually statically typecheck the arguments against the format string - all in regular code, with no special help from the compiler!
On the other hand, C has so many goodies which ought to be done right and better in modern languages, but often are not:
1. Variadic functions like printf. It sucks to wrap arguments into a list just for this.
2. Setjmp/longjmp and nonlocal returns
3. Union data types
4. Conditional macro directives to compile debug statement versions when needed.
It's easy to criticise C or patronise it saying that it was good for its time, the reality is that many of its features (or what they attempt) are futuristic even today.