Вы просто выделяете достаточно памяти для хранения другой char*
вместо фактической строки.И затем вы перезаписываете указатель переданным указателем.Позже вы попытаетесь освободить этот указатель, что означает, что он попытается освободить память, из которой вы взяли указатель и передали его функции.Вместо этого вы должны сделать следующее:
vcard *vcard_new(char *cnet, char *email, char *fname, char *lname, char *tel)
{
vcard* new = (vcard*)malloc(sizeof(vcard));
new->cnet = malloc(strlen(cnet)+1);
strcpy(new->cnet, cnet);
...
}
Или, если strdup
доступно в вашей системе:
vcard *vcard_new(char *cnet, char *email, char *fname, char *lname, char *tel)
{
vcard* new = (vcard*)malloc(sizeof(vcard));
new->cnet = strdup(cnet);
...
}