Самый простой способ - изменить makeguy () следующим образом:
char* dna = makedna();
strcpy(guy->dna, dna);
free(dna);
Но это не очень хорошее решение, поскольку вы выделяете память в одном месте и освобождаете ее в другом. Лучше сделать malloc и бесплатно в одном месте. Поэтому я рекомендую изменить makedna () на:
void* makedna(char* dna, int dna_len)
{
int i;
for(i = 0; i < dna_len; i++)
dna[i] = randchar();
}
Вы можете вызвать makedna () следующим образом:
char* dna = (char*)malloc(DNALEN+1);
makedna(dna, DNALEN);
dna[DNALEN] = 0;
strcpy(guy->dna, dna);
free(dna);
Теперь makedna () делает только то, что от нее требуется: создать последовательность ДНК. Об управлении памятью должен позаботиться абонент. Кроме того, это решение дает гибкость использования статического массива символов, если это требуется на другом сайте вызова.