Puedes determinar el tamaño de c1 y reservar un bloque de ese tamaño, luego copias directamente c1 a ese bloque y ya lo tienes, algo asi:
Código C++:
Ver originalint sz = 0, sx = 0;
for(int m = 0; m < n; m++) {
//sz += (strlen(c1[m]));
sz
+= (strlen(c1
[m
]) + 1);//*nota*}
sx = (sizeof(char *));
carpetas1 = new char* [sz + sx];
delete [] c1;
c1 = 0;
//ok ya tienes una copia de c1 mas un espacio libre en carpetas1[n]
*nota* En esta linea puedes preservar el \0 del final de char* en caso de que exista, si en c1 no hay \0 final no debes preservarlo, esto depende de como lo implementes.
Recuerda que para cada new necesitas un delete.
Si estas intentado ampliar la memoria y vas a trabajar con char* tal vez te resulte mas util usar malloc y realloc sobre un unico vector. Desconozco si en c++ hay un equivalente a realloc, seria question de echarle un vistazo.
Saludos
vosk