The reason for the warnings and error is that strncpy() accepts char * arguments, which is different from unsigned char *.
Assuming the two arrays in the structs are the same size simply do
memcpy(d1.d.something, c->do_something, sizeof(d1.d.something));
If you can’t assume the two arrays are the same size, you’ll need to write code to check and limit the copying according. memcpy() is declared in <string.h>.
Note also that operator new is C++, even if the rest of what you are doing is vanilla C, as is my answer. In C, use malloc() – declared in <stdlib.h> – instead. And remember to release the memory (using free()) when done.
solved copy from unsigned char to unsigned char