Identifikovať chyby spôsobuje Segmentácia vina (jadro dumpingové)

0

Otázka

Som nový c programovanie. Rozhodol by som sa naučiť robiť niektoré problému sady v cs50 otvoriť courseware. Nasledujúci kód vytvára Segmentácia vina (jadro dumpingové) chyba. Nemôžem pochopiť, prečo. Čítal som segmentácia chyba má čo do činenia s prístupom do pamäte nemáte prístup. Nechcem vidieť, čo by bolo príčinou, že. Ja som za predpokladu, že to má čo do činenia s ukazovateľov. Som nový ukazovatele. Ďakujem.

    #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

Ste vyhlásený ukazovateľ plávať, ale že ukazovateľ len poukázal na nič, pretože ste nemali priradiť adresu na ňu.

Zmeniť tieto riadky

float *start_population;
float *end_population;

na

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

by mala vyriešiť segmentácia chyba.

2021-11-24 08:35:58
0

Zatiaľ čo iná odpoveď vám povie riešenie, chcem zdôrazniť spôsob, ako nájsť (a riešiť) tento druh problémov: použiť ladiaci nástroj. Je dôležitým nástrojom programátora, a najlepšie je naučiť sa používať ho skôr ako neskôr. V tomto prípade, tvoj problém je dostatočne jednoduché, aby sa ľahko nájsť všetky ladiaci nástroj. Neskôr, keď budete pracovať s zložitejšie kód a multi-threading, že to bude ťažké naučiť sa ho používať, kým ste sa pokúsiť vyriešiť váš (komplex) problém. Prosím, skúste vyriešiť tento problém vo svojom vlastnom pomocou ladiaceho nástroja.

Ak ste v Linuxe, môžete použiť gdb a spustiť kód, kým sa zrúti. Potom, môžete si prezrieť backtrace (bt) vidieť vykonaný posledný riadok. Napokon, môžete definovať bod prerušenia (p #n kde #n je číslo riadka) v predchádzajúcom riadku havárie, a môžete si prezrieť hodnoty (p $variable s $variable názov premennej) a skúste zistiť, prečo to nefunguje.

S GUI debugger, by malo byť jednoduchšie (napríklad s Visual Studio alebo Code::blocks).

2021-11-24 08:58:20
0

Keď budete deklarovať ukazovateľ premennej f tak ako float *f; môžete len "použiť", ak je ukazovateľ vlastne smeroval k pamäť vyhradená pre vás (termín je pridelené). Môžete priradiť premennej na "heap" používanie malloc() funkcie, alebo, jednoduchšie vytvoriť samostatnú premennú zásobník (tzv. automatická premenná) písomne float my_float; a používať to. Tak získate:

float my_startfloat;
float *start_population = &my_startfloat;

To povedal, ja by som sa len vyhlásený float (prvý) riadok, a potom, ak je to vhodné, používa svoju adresu: &my_startfloat. Napríklad:

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

V iných jazykoch

Táto stránka je v iných jazykoch

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