Identifikovat chyby způsobující Segmentation fault (core dump)

0

Otázka

Jsem nový c programování. Rozhodl jsem se, že by se učit tím, že dělá nějaký problém nastavuje v cs50 open courseware. Následující kód vytváří Segmentation fault (core dump), chyba. Nemohu pochopit, proč. Já jsem četla segmentace chyb má co do činění s přístupem k paměti nemají přístup. Nechci vidět, co by být příčinou, že. Předpokládám, že to má co do činění s ukazateli. Jsem nový ukazatele. Děkuji.

    #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

Prohlásil jste, ukazatel na float, ale že ukazatel jen poukázal na to nic, protože jsi neměl přiřadit adresu.

Změnit tyto řádky

float *start_population;
float *end_population;

k

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

by měla vyřešit segmentation fault.

2021-11-24 08:35:58
0

Zatímco jiná odpověď vám řekne, řešení, chci zdůraznit způsob, jak najít (a vyřešit) tento druh problémů: použití ladicí program. To je důležitým nástrojem programátora, a to je nejlepší se naučit, aby ji používat dříve, než později. V tomto případě, váš problém je jednoduchý dost být snadno nalézt s jakýkoliv debugger. Později, když budete pracovat s více složitý kód a multi-threading, že to bude těžké se naučit používat, zatímco vy se pokusit vyřešit vaše (komplexní) problém. Prosím, pokuste se tento problém vyřešit na vlastní pěst pomocí ladicího programu.

Pokud jste v Linuxu, můžete použít gdb a spustit kód, dokud se zhroutí. Pak si prohlédněte backtrace (bt) chcete-li zobrazit poslední popraven řádek. A konečně, můžete definovat zarážky (p #n kde #n je číslo řádku), v předchozím řádku havárie, a zkontrolujte, zda hodnoty (p $variable s $variable název proměnné) a pokusit se zjistit, proč to nefunguje.

S GUI, debugger, to by mělo být jednodušší (například Visual Studio nebo Code::blocks).

2021-11-24 08:58:20
0

Když deklarujete proměnnou ukazatele f jako takže float *f; můžete jen "použití" je-li ukazatel skutečně ukazuje na vyhrazené paměti (termín je přiděleno). Můžete buď přidělit proměnné na "hromadu" pomocí malloc() funkce, nebo, lépe, vytvořit samostatnou proměnnou na zásobníku (tzv. automatické proměnné) písemně float my_float; a pomocí. Tak, dostanete:

float my_startfloat;
float *start_population = &my_startfloat;

To řekl, já bych jen prohlásil, float (první) linie, a pak, kde je to vhodné, používá jeho adresa: &my_startfloat. Například:

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

V jiných jazycích

Tato stránka je v jiných jazycích

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