accessor
- это указатель NULL
типа address_t
:
address_t *accessor = NULL;
и здесь вы пытаетесь получить доступ к его члену middle
, используя указатель NULL
:
memcpy(accessor->middle, myipaddr, 16 * sizeof (char)); // here is segmentation fault.
Следовательно, вы получаете ошибку сегментации в этом утверждении.
Кроме того, в вашем коде есть несколько других проблем.
Здесь вы выделяете память для ip
:
char *ip = (char *)malloc(sizeof (char));
и в следующем утверждении:
ip = my_ip(card, addr);
Вы присваиваете my_ip
возвращаемое значение функции ip
. Таким образом, вы теряете ссылку на память, выделенную в предыдущем выражении, что является утечкой памяти.
После этого вы делаете
free (ip);
ip
будет указывать на myipaddr
, возвращенную функцией my_ip
, которая является ничем иным, как адресом переменной локального массива addr
, переданной функции my_ip
. Это означает, что вы звоните free
по адресу локальной переменной. Вы можете вызывать только free()
что-то, что вы получили из функции malloc()
, calloc()
или realloc()
, иначе это вызывает неопределенное поведение.