Estoy tratando de escribir una estructura de datos con dos elementos, y luego definir una variable de ese tipo struct. Sin embargo, después de inicializar la variable en la función principal, obtengo un error de segmentación y no sé por qué.

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

struct AnimalSizes {
    char stringName[50]; 
    double sizeLength; 
    } animalSizes[2]; 

int main()
{

    struct AnimalSizes *snakes; 
    strcpy(snakes[0].stringName,"Anaconda"); 
    snakes[0].sizeLength=3.7; 
    strcpy(snakes[1].stringName,"Python"); 
    snakes[1].sizeLength= 2.4; 
    printf("%c", *snakes[0].stringName); 
    printf("%lf", snakes[0].sizeLength); 
    printf("%c", *snakes[1].stringName); 
    printf("%lf", snakes[1].sizeLength);
    return 0;
}
0
unicorns101 19 abr. 2020 a las 18:58

3 respuestas

La mejor respuesta

Intenta strcpy al destino donde no hay memoria asignada. Ese es un comportamiento indefinido. Primero debe asignar suficiente memoria para contener dos AnimalSizes instancias:

struct AnimalSizes *snakes;
snakes = malloc(2 * sizeof(struct AnimalSizes));

También aquí printf("%c", snakes[0].stringName); está intentando generar el primer carácter de stringName. Supongo que lo que desea hacer es generar una cadena completa con %s.

1
vtronko 19 abr. 2020 a las 16:08

Ha declarado un puntero a struct AnimalSizes y ha declarado una matriz struct AnimalSizes[2], pero no ha hecho que el puntero apunte a esta matriz:

int main()
{

    struct AnimalSizes *snakes = &animalSizes[0]; 
...
}

Alternativamente, puede optar por no declarar una variable global, en lugar de elegir asignar memoria en main:

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

struct AnimalSizes {
    char stringName[50]; 
    double sizeLength; 
    }; 

int main()
{

    struct AnimalSizes *snakes = (struct AnimalSizes*) malloc(2*sizeof(struct AnimalSizes)); 
    strcpy(snakes[0].stringName,"Anaconda"); 
    snakes[0].sizeLength=3.7; 
    strcpy(snakes[1].stringName,"Python"); 
    snakes[1].sizeLength= 2.4; 
    printf("%c", *snakes[0].stringName); 
    printf("%lf", snakes[0].sizeLength); 
    printf("%c", *snakes[1].stringName); 
    printf("%lf", snakes[1].sizeLength);
    free(snakes);
    return 0;
}
2
nanofarad 19 abr. 2020 a las 16:05

El siguiente código propuesto:

  1. elimina cualquier necesidad de malloc() y free()
  2. realiza la funcionalidad deseada
  3. separa la definición de la estructura de cualquier instancia de la estructura.
  4. inserta un espacio entre la primera letra del nombre de la serpiente y el "tamaño" de la serpiente, para facilitar la lectura
  5. aplica ciertos otros cambios al código para la legibilidad 'humana'

Y ahora el código propuesto:

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

struct AnimalSizes 
{
    char stringName[50]; 
    double sizeLength; 
};


int main( void )
{
    struct AnimalSizes snakes[2]; 

    strcpy(snakes[0].stringName,"Anaconda"); 
    snakes[0].sizeLength=3.7; 

    strcpy(snakes[1].stringName,"Python"); 
    snakes[1].sizeLength= 2.4; 

    printf("%c  ",  snakes[0].stringName[0]); 
    printf("%lf\n", snakes[0].sizeLength); 

    printf("%c  ",  snakes[1].stringName[0]); 
    printf("%lf\n", snakes[1].sizeLength);
    return 0;
}

Una ejecución de las salidas de código propuestas:

A  3.700000
P  2.400000
0
user3629249 20 abr. 2020 a las 17:12