Identifica eroare cauzează eroare de Segmentare (core dumped)

0

Problema

Sunt nou in programare c. Decis că ar învăța prin a face unele seturi de probleme în cs50 open courseware. Codul de mai jos produce o eroare de Segmentare (core dumped) eroare. Nu pot să înțeleg de ce. Am citit-o eroare de segmentare are de-a face cu accesarea de memorie nu au acces. Nu văd de ce ar fi cauza asta. Presupun că are de-a face cu indicii. Eu sunt nou la pointeri. Multumesc.

    #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

Ai declarat un pointer la float, dar că pointer-a arătat nimic pentru că nu atribui adresa la ea.

Schimba aceste linii

float *start_population;
float *end_population;

pentru a

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

ar trebui să rezolve eroare de segmentare.

2021-11-24 08:35:58
0

În timp ce alt răspuns spune soluție, vreau să subliniez modul de a găsi (și de a rezolva) acest tip de probleme: folosi un debugger. Acesta este un instrument important de un programator, și este mai bine să învețe să-l folosească mai devreme decât mai târziu. În acest caz, problema ta este destul de simplu pentru a fi ușor de găsit cu orice depanator. Mai târziu, când veți fi de lucru cu mai mult cod complex și multi-threading, va fi dificil de a învăța să-l folosească în timp ce încerca pentru a rezolva (complex) de problemă. Te rog, încearcă să rezolve această problemă în propria dvs. folosind un program de depanare.

Dacă sunteți în Linux, puteți utiliza gdb și rula cod până când se blochează. Apoi, puteți inspecta backtrace (bt) pentru a vedea ultimele executat linie. În cele din urmă, veți defini un punct de întrerupere (p #n în cazul în care #n este numărul liniei) în linia anterioară de accident, și de a inspecta valorile (p $variable cu $variable numele de variabile) și să încerce să vadă de ce nu merge.

Cu un GUI debugger, ar trebui să fie mai ușor (de exemplu cu Visual Studio sau Code::blocks).

2021-11-24 08:58:20
0

Atunci când declarați o variabilă pointer f ca asa float *f; puteți doar "utilizați" în cazul în care indicatorul este de fapt arătând spre memorie rezervate de tine (termenul este alocat). Puteți fie să aloce variabila pe "heap", folosind malloc() funcția, sau, mai simplu, de a crea o variabilă separată pe stiva (numit automat o variabilă) de scris float my_float; și folosind asta. Deci, veți obține:

float my_startfloat;
float *start_population = &my_startfloat;

Asta a spus, mi-ar fi declarate numai un flotor (prima) linie, și apoi, unde este cazul, utilizate adresa: &my_startfloat. De exemplu:

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

În alte limbi

Această pagină este în alte limbi

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