I usually use pointers in the following manner
char *ptr = malloc( sizeof(char) * 100 );
memset( ptr, 0, 100 ) ;
strncpy( ptr, \"cat\" , 100 - 1 );
strncpy( ptr, "\x63\x61" , 100 - 1 );
0x63 is an integer hexadecimal literal; The C compiler parses it as such within code. But within a string it is interpreted as a sequence of characters 0,x,6,3.
The literal for the char with value 63 hex. is '\x63', and within strings you must use this notation.
"c\x63" is the literal for a zero-terminated string, irrespective of the characters within the quotes (or of the notation by which you denote them), so no, you don't need to append a trailing zero manually.