Identificar causando erro de falha de Segmentação (núcleo de dumping)

0

Pergunta

Eu sou novo para c de programação. Decidi que iria aprender fazendo alguns dos conjuntos de problemas no cs50 cursos abertos. O código a seguir produz uma falha de Segmentação (núcleo de dumping) de erro. Eu não consigo entender porquê. Eu li uma segmentação de erro tem a ver com o acesso a memória que não têm acesso. Eu não vejo o que poderia estar causando isso. Eu estou supondo que ele tem a ver com os ponteiros. Eu sou novo para ponteiros. Obrigado.

    #include <stdio.h>

// https://cs50.harvard.edu/x/2021/labs/1/population/

float yearly_llamas(float starting_population) {
    // returns number of llamas at the end of the year
    float born = starting_population / 3;
    float died = starting_population / 4;
    float end_of_year_pop = starting_population + born - died;

    return end_of_year_pop;
}

int main(void) {
    
    // use floats for precision
    float *start_population;
    float *end_population;

    // set start lower limit
    int start_min = 9;

    
    // make sure input for starting population is greater than or equal to 9
    do {
        printf("Starting population: ");
        scanf("%f", start_population);
    } while (*start_population < start_min);
    
 

    // get ending population, make sure greater than or equal to the starting population
    do {
        printf("Ending population: ");
        scanf("%f", end_population);
    } while (*end_population < *start_population);

    // print for verification
    printf("%f\n", *start_population);
    printf("%f\n", *end_population);

    float end_pop = yearly_llamas(*start_population);

    printf("Llamas at the end of the year: %f\n", end_pop);


  return 0;
}
c cs50 pointers segmentation-fault
2021-11-24 05:03:05
3
0

Declarado um ponteiro para float, mas que o ponteiro apontado para nada, porque você não atribuir o endereço para ele.

Alterar estas linhas

float *start_population;
float *end_population;

para

float f_start_population;
float f_end_population;
float *start_population = &f_start_population;
float *end_population = &f_end_population;

deve resolver a falha de segmentação.

2021-11-24 08:35:58
0

Enquanto a outra resposta diz-lhe a solução, eu quero enfatizar o caminho para encontrar (e resolver) este tipo de problemas: a utilização de um depurador. É uma importante ferramenta de programador, e é melhor aprender a usá-lo mais cedo do que tarde. Neste caso, o seu problema é simples o suficiente para ser facilmente encontrado com qualquer depurador. Mais tarde, quando você vai trabalhar com o código mais complexo e multi-threading, vai ser difícil aprender a usá-lo enquanto você tenta resolver seu (complexo) problema. Por favor, tente resolver este problema no seu próprio usando um depurador.

Se você estiver no Linux, você pode usar o gdb e executa o código até que ele falha. Em seguida, você pode inspecionar o backtrace (btpara ver a última linha executada. Por último, você pode definir um ponto de interrupção (p #n onde #n é o número da linha) a linha anterior do acidente, e a inspecionar os valores (p $variable com $variable o nome da variável) e tente ver por que isso não funciona.

Com uma GUI depurador, deveria ser mais fácil (por exemplo, com o Visual Studio ou o Code::blocks).

2021-11-24 08:58:20
0

Quando você declara um ponteiro variável f como float *f; você só pode "usar" se o ponteiro está na verdade apontando para a memória reservados por você (o termo é atribuído). Você pode atribuir a variável sobre a "pilha" usando o malloc() a função, ou, mais fácil, crie uma variável separada na pilha (chamado de uma variável automática) escrevendo float my_float; e usando isso. Assim, você obtém:

float my_startfloat;
float *start_population = &my_startfloat;

O que disse, eu só teria declarado um float (primeira) linha e, em seguida,, quando apropriado, usado o seu endereço: &my_startfloat. Por exemplo:

 float my_startfloat;
 scanf("%f", &my_startfloat);
2021-11-24 09:08:03

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................