es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Fallo de segmentación al intentar concatenar un elemento de un arreglo 2D

Quería usar strcat() para concatenar un elemento de un arreglo de cadenas. Intenté:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char **str = malloc(sizeof(char *) * 3);

    for (int i = 0; i < 3; i++) {
        str[i] = malloc(sizeof(char) * 8);
    }

    str[0] = "foo";
    str[1] = "bar";

    strcat(str[0], "H");

    for (int i = 0; i < 3; i++) {
        printf("%s\n", str[i]);
    }

    free(str);

    return 0;
}

y obtengo el error:

Segmentation fault (core dumped)

¿Qué debo hacer para hacerlo correctamente?</string.h></stdlib.h></stdio.h>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema es que str[0] apunta a un literal de cadena que es de solo lectura y no se puede modificar. strcat() intenta modificarlo agregando un carácter, lo que causa un fallo de segmentación. Para solucionar esto, debes asignar memoria para str[0] usando malloc() y copiar el literal de cadena usando strcpy() antes de modificarlo con strcat(). El fragmento de código corregido es el siguiente:

    “`
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    int main() {
    char **str = malloc(sizeof(char *) * 3);

    for (int i = 0; i < 3; i++) {
        str[i] = malloc(sizeof(char) * 8);
    }
    
    strcpy(str[0], "foo");
    strcpy(str[1], "bar");
    
    str[0] = realloc(str[0], sizeof(char) * 9); // asignar más memoria para el carácter agregado
    strcat(str[0], "H");
    
    for (int i = 0; i < 3; i++) {
        printf("%s\n", str[i]);
    }
    
    free(str[0]); // liberar por separado ya que fue realocado
    free(str[1]);
    free(str);
    
    return 0;
    

    }
    “`</string.h></stdlib.h></stdio.h>

Comments are closed.