в функции: mystrcat()
Это утверждение:
buf = malloc(strlen(buf) + 1);
неверно.Поскольку buf
уже является указателем на выделенную память И это не изменение указателя buf
обратно в функцию main()
, а скорее только параметр в стеке.
Чтобы исправить:
в main()
(обратите внимание на дополнительный '&' в параметре: buffer
)
buffer = mystrcat(&buffer, 16, argv[1], argv[2], argv[3], argv[4],
argv[5], argv[6], NULL);
в mystrcat()
удалить эту строку
buf = malloc(strlen(buf) + 1);
относительно:
if(sz < strlen(first) + 1)
{
sz += (strlen(first) + 1);
}
, поскольку sz
содержит 16, а первый символ в buf
равен '\ 0'. Этот оператор if()
никогда не будет введен.
Поскольку переданный параметр buf
теперьуказатель на указатель, из-за изменения в main()
подпись должна быть:
char* mystrcat(char **buf, size_t sz, char *first, ...)
и все ссылки на buf
должны разыменовывать этот параметр для доступа к значению указателя в main()
Существует гораздо больше, но выше перечислены основные проблемы