Generic dynamic array
naming da* + all lower case makes it hard to parse the difference between the prefix and the name of the function, instead either pick da_snake_case or daCamelCase.
returning void* is not ideal instead create a opaque (incomplete) struct and just let the use pass pointers to that struct around:

struct DynamicArray;

DynamicArray* danew(size_t unitsize);