C Principiante – Copiando una matriz char * a otra matriz char *

He estado luchando con esto por un tiempo estúpidamente largo. Básicamente, necesito copiar una matriz de punteros de caracteres a otra matriz de punteros de caracteres.

En este momento, tengo la función:

void copyArray(char *source[], char *destination[]) { int i = 0; do { destination[i] = malloc(strlen(source[i])); memcpy(destination[i], source[i], strlen(source[i])); } while(source[i++] != NULL); } 

Esto resulta en una falla de segmentación. ¿Alguien podría ayudar por favor?

¡Gracias!

EDIT: progtwig de muestra

 #include  #include  #include  // Copy the contents of one array into another void copyArray(char *source[], char *destination[]){ // printf("In copy array"); int i = 0; do { destination[i] = malloc(strlen(source[i])); memcpy(destination[i], source[i], strlen(source[i])); } while(source[i++] != NULL); } void addToHistory(char *history[][40], char *args[]){ int i; for(i = 1; i < 10; i++){ copyArray(history[i], history[i-1]); } i = 0; copyArray(args, history[0]); } int main(void){ char *history[10][40]; char *args[40]; history[0][0] = NULL; args[0] = "ls"; args[1] = NULL; addToHistory(history, args); } 

  1. Asegúrese de que el último elemento de la matriz de source sea NULL , antes de pasarlo a copyArray .

  2. En copyArray , ponga el while lugar del do , e incremente i solo al final del bucle.

En lugar de todo lo anterior, puede simplemente cambiar i++ a ++i en la función copyArray .

Pero se bloqueará si el primer elemento de la matriz de source pasa a esta función es NULL .

Creo que tienes un error off-by-one:

 do { destination[i] = malloc(strlen(source[i])); memcpy(destination[i], source[i], strlen(source[i])); } while(source[i++] != NULL); ^^^ 

Verifica si era NULL después de que ya lo usaste y luego finalizas el bucle. Intenta reemplazarlo con

 } while (source[++i] != NULL); // or while (source[++i]), for short 

Puede intentar registrar un mensaje corto después de cada iteración para ver dónde falla el código.

Edición: ¿Hay alguna razón por la que esté utilizando memcpy() (que no copiará el '\0' ) en lugar de strcpy() (que lo hará)?

(Nota para @wildplasser: creo que strdup() puede no ser estándar C).

 void copyArray(char *source[], char *destination[]) { while ((*destiantion = *source)) { *destination++ = strdup( *source++ ); } } 

Por cierto: es común hacer que el destino sea el primer argumento, igual que en strcpy()

 void copyArray(char *destination[], char *source[]) { ... }