C ошибка сегментации при использовании структур - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь написать структуру данных с двумя элементами, а затем определить переменную структуры этого типа. Однако после инициализации переменной в основной функции я получаю ошибку сегментации и не знаю почему.

#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;
}

Ответы [ 3 ]

2 голосов
/ 19 апреля 2020

Вы объявили указатель на struct AnimalSizes, и вы объявили массив struct AnimalSizes[2], но вы не указали указатель на этот массив:

int main()
{

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

В качестве альтернативы, вы можете решите не объявлять глобальную переменную, а просто выделите память в 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;
}
1 голос
/ 19 апреля 2020

Вы пытаетесь strcpy к месту назначения, где нет выделенной памяти. Это неопределенное поведение. Сначала вы должны выделить достаточно памяти для хранения двух AnimalSizes экземпляров:

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

Также здесь printf("%c", snakes[0].stringName); вы пытаетесь вывести первый символ stringName. Я предполагаю, что вы скорее хотите сделать, это вывести всю строку с %s.

0 голосов
/ 20 апреля 2020

следующий предложенный код:

  1. устраняет необходимость в malloc(), а free()
  2. выполняет желаемую функциональность
  3. разделяет определение структуры из любого экземпляра структуры.
  4. вставляет некоторый интервал между первой буквой имени змеи и «размером» змеи, для удобства чтения
  5. применяет некоторые другие изменения к коду для ' человеческая читаемость

и теперь предложенный код:

#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;
}

прогон выходов предлагаемого кода:

A  3.700000
P  2.400000
...