If veccreate expands into a new struct definition then how do you return that or pass it as an argument to a function ? If they are only used as members of other structs then that ' ll work , but unfortunately anonymous structswhich have the same definition are not compatible according to the standard . If you going the traditional void route then you can go further than realloc while staying in the same spirit . A situation that calls for a dynamic array is when you don ' t know the size of input or output in advance . Here it can be convenient to have a small data structure for book keeping and a function similar to void appendstruct vec , sizet size , sizet align which wraps the realloc function . The append function calculates the new size , checks for overflow , updates the data structure i . e . beginning and end of vector and returns a pointer to the newly appended member which can then be initialized normally . Sometimes when the vector has been built you can extract the vector pointer and forget about the book keeping data structure altogether , but other times you want to keep on growingmanipulating the vector for a long period of time . But in essence , you don ' t have to make it too complex and you don ' t have to make the vector type part of your interfaces .