Settings

Theme

C array types are weird

anselmschueler.com

57 points by signa11 2 days ago · 29 comments

Reader

fooker an hour ago

C array types are weird because C doesn't really need arrays. It's not what C was about.

But if you designed a language in the era where Fortran, THE array language, reigned supreme, nobody would use your language. The mindshare Fortran had is difficult to convey now, half a century later.

Think of it like making a chatbot today and not mentioning AI or LLMs, that's what making a language without arrays would have felt like in 1970.

uecker 2 days ago

In practice, the [static n] notation can give you useful warnings and bounds checking.

https://godbolt.org/z/PzcjW4zKK

And while the (*array_ptr)[3] notation take a moment to get used to, it is very logical. If you have a pointer to an array, you dereference it first and then indx into it. Again, useful for bounds checking: https://godbolt.org/z/ao1so9KP7

  • keyle 3 hours ago

    I know of this notations but I don't see many people using [static n].

    Not sure why, maybe it doesn't feel like C anymore, maybe it feels hacky?

    typically if you're passed an array you'd want to get more anyway, so you'd get passed a struct. Not sure.

  • dnautics 4 hours ago

    What is **int[3][5]

    • thrance 3 hours ago

      A pointer to a pointer to a pointer to a pointer of integers.

    • ori_b 3 hours ago

      A syntax error. You need a variable name, not a type name, in the middle.

      • ori_b 3 hours ago

        And if you want 'int **arr[a][b]', it's a value that when you say 'x = **arr[m][n]', will evaluate to an int and assign it to x. Postfix has higher precedence than prefix.

      • fusslo 3 hours ago

        or a rejected PR

kazinator 2 hours ago

There is a history to it; in one of the predecessor languages, like B, Ritchie actually had arrays that had a hidden pointer to their start. The "array to pointer decay" was actually a real operation that loaded an address from memory, and it was possible to twiddle the bits to relocate an array. One problem with it was no way to initialize such a pointer field that would allow an array to live in dynamically allocated storage (no constructors in the language).

So in short, the bad design (array values produce pointers) was informed by conceptual compability with an earlier design in which that was literally happening.

the__alchemist 4 hours ago

This is one of the things that I feel is an inappropriate abstraction that is around for historical reasons. When I do FFI to call C from rust, I usually wrap the generated API (Which is pointer based) into rust's &[] array syntax. Arrays/lists/Vecs etc in most non-C languages feel like an abstraction over a collection of items; I feel like C's exposing the pointer directly is taking a low-level memory/MMIO operation and inserting it into business logic. Conceptually, I like to keep them separate; pointers for writing drivers, accessing registers, writing to flash memory etc. Arrays/lists/vecs for higher level operations on collections.

Tangent: I have a pet theory that part of Zig's raison d'etre is to fix some of the problems with C, while accommodating its pointer-based data structures, and the resulting patterns.

mlmonkey an hour ago

It still cracks me up that 3[x] and x[3] mean the same thing in C.

IncreasePosts 4 hours ago

Paging walter bright

fatty_patty89 4 hours ago

there's no array type in c

throwaway27448 3 hours ago

Why are we still discussing c in 2026? Why are you intentionally hamstringing yourself unless you're using fucking hp-ux

Keyboard Shortcuts

j
Next item
k
Previous item
o / Enter
Open selected item
?
Show this help
Esc
Close modal / clear selection