a = (unsigned char *)malloc(sizeof(char [100]));
でもだめか?
それから
unsigned char *p = a;
はループの外に出せ。