с этим оператором struct argument *arg2 = malloc(sizeof(struct argument));
вы выделяете память для самой структуры. Структура содержит следующие поля:
struct argument {
char *source; // << a pointer to a character string
char *destination; // << another pointer
int value; // integer value
};
Далее вы пытаетесь скопировать строку, используя один из указателей: strcpy(arg2->source, "a1");
. Но ... в памяти нет места для строки. Вы выделили место для указателя (часть структуры), но не для строки, на которую он будет указывать. Это вызывает повреждение памяти и ваш сбой.
Итак, прежде чем копировать строку, выделите для нее место:
arg2->source = malloc(3);
вам нужно '3', что на 1 символ длиннее, чем длинастрока 'a2'.
такая же для другой строки.
Вам не нужно ничего делать для value
. Это не указатель, а часть структуры, которая уже выделена.