#include // using malloc, free #include // using strlen, memcpy char* concatenate_strings(const char** strs, size_t n) { size_t* lens; if(! (lens = malloc(n * sizeof(*lens)))) goto err_rtrn; size_t total_len = 0; size_t i; for(i = 0; i < n; ++i) { size_t cur_len = strlen(strs[i]); lens[i] = cur_len; total_len += cur_len; } char* concat; if(! (concat = malloc(total_len + 1))) goto err_free_lens; char* writepos = concat; for(i = 0; i < n; ++i) { size_t cur_len = lens[i]; writepos = memcpy(writepos, strs[i], cur_len) + cur_len; } *writepos = '\0'; free(lens); return concat; err_free_lens: free(lens); err_rtrn: return NULL; }