Cómo copiar una matriz de puntero a otro en C

Estoy tratando de almacenar una matriz de puntero char a otra matriz de puntero char. Estoy recibiendo la falla de segmentación por el mismo.

int main(int argc, const char* argv[]) { int argcCpy = argc; char* argvCpy[10] = {}; for(argcCpy = argc; argcCpy>0; argcCpy--) { argvCpy[argcCpy] = (char *) malloc(strlen(argv[argcCpy])); memcpy(argvCpy[argcCpy], argv[argcCpy], strlen(argv[argcCpy])); printf("\nCount: %d, string: %s", argcCpy, argvCpy[argcCpy]); } return 0; } 

Pasé más que suficiente tiempo para hacer que esto funcionara, pero no puedo hacerlo. Además, ya se hace el mismo tipo de pregunta que también queda sin respuesta. Si alguien puede hacerme saber el código de trabajo para el mismo, sería realmente muy útil.

Esperando que esto sea respondido.

Enlace de la pregunta similar omitido sin cesar – C Principiante – Copiando una matriz char * a otra matriz char *

Gracias.

 #include  #include  #include  int main(int argc, const char* argv[]) { int argcCpy = argc; char* argvCpy[10] = {}; if (argc > 9) { return 1; } for(int i = argc; i > 0; i--) { if (argv[i] == NULL) { argvCpy[i] = NULL; } else { argvCpy[i] = (char *) malloc(strlen(argv[i]) + 1); if (argvCpy[i] != NULL) { strcpy(argvCpy[i], argv[i]); } } } for (int i = 0; i <= argcCpy; i++) { if (argvCpy[i] != NULL) { printf("Count: %d, string: %s\n", i, argvCpy[i]); } else { printf("Count: %d, string is null\n", i); } } return 0; } 

Compruebe argc no es demasiado alto. argv[argc] es NULL, tenga esto en cuenta. Use strcpy y asigne suficiente espacio para el final \0 .

Edición: Segundo bucle para mostrar contenido.

Debe asignar un byte más para el NUL de terminación:

Cambio

  malloc(strlen(argv[argcCpy]); 

a

  malloc(strlen(argv[argcCpy] + 1); 

y también debes copiar un byte más con memcpy

Cambio

  memcpy(argvCpy[argcCpy], argv[argcCpy], strlen(argv[argcCpy])); 

a

  memcpy(argvCpy[argcCpy], argv[argcCpy], strlen(argv[argcCpy]) + 1); 

Por cierto puedes reemplazar

  memcpy(argvCpy[argcCpy], argv[argcCpy], strlen(argv[argcCpy]) + 1); 

por

  strcpy(argvCpy[argcCpy], argv[argcCpy]); 

Lo que es más sencillo y más claro.

Y por último pero no menos importante reemplazar

 for(argcCpy = argc; argcCpy>0; argcCpy--) 

por

 for(argcCpy = argc - 1; argcCpy>0; argcCpy--) 

El último elemento de la matriz argv[argc-1] es argv[argc-1] .

Pero tenga en cuenta que tendrá problemas si tiene más de 10 argumentos de línea de comandos.