Хорошо, иногда вам приходится это делать, функция C strdup () делает то же самое, вы просто должны следовать соглашению, чтобы освободить его после использования. Но я видел большую проблему в вашем коде: вы фактически позволяете записывать больше данных, чем выделенный вами размер.
Это попытка исправить это:
unsigned char * prep( int length,int args, ... )
{
int i = 0;
int len = 0;
unsigned char *source_message ;
int step = 0;
unsigned char *message = (unsigned char *) malloc(length);
va_list listp;
va_start( listp, args );
for(i = 0 ; i < args && step <= length; i++ ) {
source_message = va_arg( listp, unsigned char *);
len = va_arg( listp, long);
memcpy(message+step,source_message,(step+len >length)?length-step:len);
step+=len;
}
va_end( listp );
return message;
}
используйте это как.
char * p = prep(size,2,"message 1",9,"message 2",9);
if (p) {
.... work with p....
free(p);
}