Note that I'm using a C++ compiler ( hence, the cast on the calloc function calls) to do this, but the code is essentially C.Basically, I have a typedef to an unsigned char known as viByte, which I'm using to create a string buffer to parse a file from binary (a TGA file, to be exact - but, that's irrelevant).I'm writing basic functions for it right now; append, prepend, new, etc.The problem is that, on the first iteration of the first loop in viByteBuf_Prepend, I get a segmentation fault. I need to know why, exactly, as this is something which could keep me up all night without some pointers (pun intended). I also would like to know if my algorithms are correct in terms of how the buffer is pre-pending the viByte string. For example, I have a feeling that using memset too much might be a bad idea, and whether or not my printf format for the unsigned char is correct (I have a feeling it isn't, as nothing is getting output to my console). Compiling on GCC, Linux.#ifdef VI_BYTEBUF_DEBUGvoid viByteBuf_TestPrepend( void ){    viByteBuf* buf = viByteBuf_New( 4 );    buf->str = ( viByte* ) 0x1;    printf( Before viByteBuf_Prepend => %uc , buf->str);    viByteBuf_Prepend( buf, 3, ( viByte* ) 0x2 );    printf( After viByteBuf_Prepend => %uc , buf->str);}#endifviByteBuf* viByteBuf_New( unsigned int len ){    viByteBuf* buf = ( viByteBuf* ) calloc( sizeof( viByteBuf ), 1 );    const int buflen = len + 1;    buf->str = ( viByte* ) calloc( sizeof( viByte ), buflen );    buf->len = buflen;    buf->str[ buflen ] = '\0';    return buf;}void viByteBuf_Prepend( viByteBuf* buf, unsigned int len, viByte* str ){    unsigned int pos, i;    const unsigned int totallen = buf->len + len;    viByteBuf* tmp = viByteBuf_New( totallen );    viByte* strpos = buf->str;    memset( tmp->str, 0, tmp->len );    int index;    for( i = 0; i < buf->len; ++i )    {       index = ( buf->len - i ) - 1;       *strpos = buf->str[ 0 ];       ++strpos;    }    memset( buf->str, 0, buf->len );    printf( %uc\n, buf->str );    i = totallen;    for ( pos = 0; pos < len; ++pos )    {        tmp->str[ pos ] = str[ pos ];        tmp->str[ i ]   = buf->str[ i ];        --i;    }    memset( buf->str, 0, buf->len );    buf->len = tmp->len;    memcpy( buf->str, tmp->str, tmp->len );    viByteBuf_Free( tmp );    //memset(  )    //realloc( ( viByteBuf* ) buf, sizeof( viByteBuf ) * tmp->len );}
C-Style unsigned char parsing and manipulation
c;strings;parsing