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.

Copie una cadena a un miembro de la estructura *struct.

He revisado temas de índole similar, pero no encontré una solución para mi problema. Tengo una estructura así:

typedef struct {
    int number;
    char *string;
} mystruct;

Luego defino un puntero a la estructura:

mystruct *data;

Asigno memoria:

data = malloc(sizeof(mystruct));

Asigno un número, digamos 5:

(*data).number = 5;

Hasta aquí todo bien, funciona (comprobé que puedo recuperar el número 5 desde otra parte de la estructura), pero:

strcpy((*data).string = "¡Hola!");
// Esta línea arroja un fallo de segmentación.

No entiendo por qué. ¿Alguien puede explicarme qué estoy haciendo mal?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema con el código es que el puntero a char (variable string) no tiene memoria asignada antes de que se realice la operación strcpy.

    En el código dado, el char *string dentro de la estructura mystruct es solo un puntero a una ubicación de memoria, a la cual no se le ha asignado memoria. Entonces, cuando se realiza la operación strcpy, intenta copiar la cadena literal “Hello!” a una ubicación de memoria que no ha sido asignada, lo que resulta en un fallo de segmentación.

    Para solucionar este problema, debes asignar memoria para la variable string antes de realizar la operación strcpy. Puedes asignar memoria usando la función malloc, de esta manera:

    (*data).string = malloc(strlen("Hello!") + 1); // +1 para el carácter '\0' al final
    strcpy((*data).string, "Hello!");
    

    Aquí, malloc se usa para asignar memoria para la cadena, y strlen se usa para obtener la longitud de la cadena que se va a copiar. Se agrega +1 ya que necesitamos asignar memoria para el carácter terminador nulo al final de la cadena. Finalmente, la función strcpy se usa para copiar la cadena a la ubicación de memoria asignada.

Comments are closed.