The short answer is not to do tricks like casting a pointer to short into a pointer to int, as anything you do with that pointer to int subsequently yields undefined behaviour. If you want an int, declare it as an int. Or, to put it another way, find a way to write your program so you can make it compile without using a typecast (which is simply an instruction to the compiler not to complain when you do something potentially invalid).

The most common basic reason for wanting to interpret an array of shorts as an int is that your program makes assumptions about relative sizes of types (eg in your case, you are assuming an int is twice the size of a short --- which is not true for all compilers). There are all sorts of reasons why you may wish to make that assumption (eg saving data in a binary format, which means both the program reading the file and the program writing the file must agree on precise layout of bits in characters, shorts, floats, data structures, etc) and eliminating such assumptions often requires basic design changes (eg defining a protocol and enforcing it in a PORTABLE manner).

Incidentally, bus errors can result from other invalid operations on pointers (not just from issues with alignment). While the most common behaviour from invalid pointer operations (eg dereferencing a NULL, falling off the end of an array) is a core dump, a bus error is another possible result.