После того, как вы объявите int *j;
, в стеке (в данном случае) выделяется пространство типа int *
, которое имеет некоторый адрес addr_stk
и с содержимым, которое мы не знаем, т.е. мусор.
+--------+ +--------+
| ??? |----+ | xxx | trying to store 50 here
+--------+ | +--------+
| j | | | |
+--------+ | +--------+
|addr_stk| +---->| ??? | have no permission to access this location
+--------+ +--------+
Когда вы используете *j = 50;
, содержимое переменной-указателя (объекта) j
используется в качестве адреса для хранения значения 50
. Поэтому вы пытаетесь сохранить значение 50 в некотором адресном местоположении, которое имеет значение адреса мусора, что означает, что оно может быть где угодно. Всякий раз, когда вы пытаетесь получить доступ к тем ячейкам памяти, которые вам не выделены, вы не сможете сохранить или получить доступ к этой папке, операционная система остановит вас и выдаст ошибку.
Сначала нужно инициализировать переменную-указатель j
с некоторым допустимым адресом. Это можно сделать, сначала выделив часть памяти с помощью malloc
, а затем используя ее. Или инициализировать j
адресом какой-либо другой переменной (локальной или глобальной). как
int *j, i;
j = &i;
*j = 50;
или
int *j;
j = malloc (sizeof (int));
*j = 50;
в обоих случаях при доступе к *j
у нас есть действительный адрес внутри j
, поэтому использование содержимого j
в качестве адреса (указатель доступа) допустимо, так как *j
разрешает допустимый доступ к памяти .
Важно то, что когда вы выделяете память с помощью malloc
, вы всегда должны освобождать память. Это хорошая привычка, иначе в больших программах это приведет к утечкам памяти.