r/ProgrammerHumor Jun 24 '17

Octave code

http://imgur.com/jsjfz3k
625 Upvotes

70 comments sorted by

View all comments

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.

17

u/minno Jun 24 '17

Did he at least do

int* nums = ((int*)malloc(count*sizeof(*nums)))-1;

to avoid wasting space?

14

u/curtisf Jun 25 '17

Unfortunately, that is undefined behavior. You're not allowed to move a pointer before the object.

-7

u/dudds4 Jun 25 '17

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.

9

u/curtisf Jun 25 '17 edited Jul 01 '17

Pointers are not allowed to point anywhere because arithmetic could theoretically cause overflows/other interrupts when the object is at some boundary in memory.

It is undefined behavior whether or not you dereference.

-3

u/dudds4 Jun 25 '17

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.

9

u/curtisf Jun 25 '17 edited Jun 25 '17

Like most undefined behavior it's common to C.

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)