Когда вы создаете указатель struct node *ptr;
, он будет помещен в ваш стек.
Место, где находится эта переменная, может быть где угодно в вашем стеке.
Например, он находится по адресу 0x100.
Когда переменная помещается в это место, данные, которые там находятся, не устанавливаются в 0
Так, например, по адресу 0x100
были данные 0x200
, у вас будет struct node *ptr
, указывающий на адрес 0x200
.
Затем в этот момент вы делаете следующее: ptr->data=3;
Поскольку код считает, что на вашем адресе 0x200 находится struct node
, он заполнит переменную data
. Таким образом, по адресу 0x200 будет записано значение 3
.
Когда вам повезет (ну, на самом деле это не совсем удача, поскольку это может вызвать много проблем в дальнейшем), запись значения 3
по адресу 0x200
не вызовет никаких проблем, потому что память по адресу 0x200
не использовалась.
Но имейте в виду, что ваш код ДУМАЕТ только о том, что struct node
был размещен в этом месте, но на самом деле его нет, поэтому любая другая переменная может быть в этом месте. И когда есть другая переменная по этому адресу. когда вы записываете значение 3
по этому адресу, вы перезаписываете значение этой переменной. И это может создать очень странное поведение в вашем коде.