Я вижу проблему здесь: struct st_args *args
локально, и вы return
редактируете ее, не выделяя надлежащую память.
struct data *data = malloc(sizeof(data));
В этом случае data
является указателем, а malloc
выделил бы 4 (или 8) байта памяти. Это должно было быть,
struct data *data = malloc(sizeof(struct data));
Это выделит (если доступно) необходимую память, и segfault исчезнет.
Кроме того, вы должны проверить, является ли data
значением NULL
после malloc
, если да, то обработать ошибку, как вы сделали в функции args_f
.
Именно по этой причине мы должны избегать соглашения об именовании переменных, в котором определяемые пользователем типы данных и имена переменных могут совпадать.
Кстати, когда у меня есть typedef
, у меня обычно есть суффикс _t
, чтобы избежать путаницы.
Например,
Это
struct data{
int n;
void * cl;
}typedef data;
было бы что-то вроде этого в моем коде
typedef struct stData {
int32_t i_N;
void *p_cl;
} data_t;