int length = sizeof(numbers) / sizeof(numbers[0]);
sizeof returns the size of the array in bytes and not the number of items in the array. Since this array contains integers that are 4 bytes one-by-one sizeof probably returns 5*4 so sometimes you read garbage from memory by overindexing the array.
In my codebase I follow a convention that is pretty practical. I refer to size of something in bytes with "size" while I refer to the number of items in a sequence (array or string or whatever) with "length". For example if I had an array class then I would name the method that returns the number of items as GetLength().