Ваш указатель не указывает на что-либо действительное.Все, что вам нужно сделать, это присвоить значение 1
указателю на int, но 1
не является допустимым местом в памяти.
Единственный действительный способ получить значение указателя - это либо взять адрес-переменной переменной или вызовом функции выделения:
int a;
int * p1 = &a; // OK
int * p2 = malloc(sizeof(int)); // also OK
*p1 = 2;
*p2 = 3;
Что касается «почему должна быть проблема»: что касается языка, если вы разыменовываете недействительный указатель, у вас неопределенное поведение,так что может случиться что угодно - это действительно единственный разумный способ указать язык, если вы не хотите вводить какие-либо произвольные ограничения, а язык C прост в реализации.
Практически современныйОперационные системы обычно имеют умный диспетчер виртуальной памяти, который должен запрашивать память, когда и когда это необходимо, и если памяти по адресу 1
еще нет на зафиксированной странице, вы на самом деле получите сообщение об ошибке ОС.Если вы попытаетесь указать значение указателя возле какого-либо фактического адреса, вы можете не получить сообщение об ошибке (возможно, пока не выйдете за границы страницы).