Where would you have it point as a sensible default? Bear in mind that "sensible" needs to cover everything from writing C on a super computer, through your desktop machine and right down to the embedded system inside your toaster.
And having made it point somewhere, who's responsibility would it then be to free that associated memory at some future time. You can't allocate it on the stack because of the problems of someone returning the pointer itself.
Besides, being a pointer, how would you decide how much memory to point to?
Just one int, or maybe 10. How about 10000?
*p = 10;
p = 10;
are the same as far as the language is concerned, so there's no stopping someone from doing say p or p either. So now you've replaced an uninitialised pointer problem with an out of bound access problem. In other words, you've just rearranged the deck chairs on the Titanic.
This has no default value either, so in that respect a pointer is no different. It too starts out with junk until YOU specifically do something to initialise or assign a value.
C does exactly what you ask it to. There is no baggage for keeping things in order because of programmer lazyness.
If you want that kind of behaviour, then use a std::vector in C++.
IMO, the sensible default is to declare
int *p = NULL;
Which on most machines gives a predictable response to trying to dereference the pointer before assigning it a memory location to point to. This is far better than it randomly working and the programmer believing that everything is still OK.