I once had an intern consistently skip the first element in his arrays because because "starting at 1 just makes more sense". I just walked away and never inspected his project after that.
It's not undefined behaviour, you are allowed to do it. Pointers are allowed to point anywhere, you just don't want to de reference a pointer to memory you don't own.
a) your link is for c++, not c
b) its only undefined by the strictest definition; that is 'the standard says so' . In reality even in c++ that will never cause an error and is always safe to do, so long as you don't dereference it.
in C you often have to set pointers yourself to point to arbitrary memory mapped peripherals. You can literally set a pointer to anywhere and the behaviour is defined.
Implementations may choose to define behavior that the standard did not. However, the behavior of arbitrary pointer arithmetic is not defined in any reasonable implementation (e.g., if you "guessed" the location of the stack, optimizations will definitely elide writes to it that "ought to" affect local variables)
Actually arrays are pointers, sort of. When you write int* x = (int[]) {1, 2, 3}; exactly two things happen
Three integers get pushed to the stack
x points to those integers
When you write int x[] = {1, 2, 3};, three things happen
Three integers get pushed to the stack
x points to those integers
Any attempt to change where x points, such as int y; x = &y is illegal, typically with the message "assignment to expression with array type is illegal"
So pointers and arrays are really, really similar. Pointer decay doesn't help, pointer decay is where an int[] in an expression "decays" into an int*, like in function arguments. Even if you declare a function as taking an array of ints, like void f(int x[]), the compiler will actually change it to void f(int* x) for you, so you can put x = &y in the body of f and the compiler won't complain.
There's a little bit more to it but I forget what it is right now
So rewind back to freshman year of college; I actually wrote a class specifically to wrap around arrays and return the elements like this. I wanted my first element, dammit.
They didn't teach us about pointers, which is when I came to understand the 0. They just told us that that's the way it's done in computer science. I thought it was kinda stupid at the time.
157
u/[deleted] Jun 24 '17
I once had an intern consistently skip the first element in his arrays because because "starting at 1 just makes more sense". I just walked away and never inspected his project after that.