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); }
Asegúrese de que el último elemento de la matriz de source
sea NULL
, antes de pasarlo a copyArray
.
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[]) { ... }