Identificare errore che causa Segmentation fault (core dumped)

0

Domanda

Sono nuovo di programmazione c. Ho deciso di imparare facendo alcuni problemi in cs50 open courseware. Il codice seguente genera un errore di Segmentazione (core dump) di errore. Non riesco a capire perché. Ho letto di un errore di segmentazione ha a che fare con l'accesso a memoria non si dispone di accesso. Non vedo che cosa vorresti essere la causa che. Sto supponendo che si ha a che fare con i puntatori. Sono nuovo di puntatori. Grazie.

    #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

Si dichiara un puntatore a float, ma che il puntatore punta a nulla, perché non assegnare un indirizzo ad esso.

Modificare le righe

float *start_population;
float *end_population;

per

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

dovrebbe risolvere l'errore di segmentazione.

2021-11-24 08:35:58
0

Mentre l'altra risposta indica la soluzione, voglio sottolineare il modo per trovare (e risolvere) questo tipo di problemi: l'uso di un debugger. Si tratta di un importante strumento di un programmatore, ed è meglio imparare ad usarlo prima che poi. In questo caso, il tuo problema è abbastanza semplice da essere facilmente trovato con qualsiasi debugger. Più tardi, quando si lavora con un codice più complesso e multi-threading, che sta andando essere difficile da imparare mentre si tenta di risolvere il (complesso) problema. Si prega di cercare di risolvere questo problema utilizzando un debugger.

Se sei in Linux, è possibile utilizzare gdb ed eseguire il codice fino a quando non si blocca. Quindi, controllare il backtrace (bt) per vedere l'ultima riga di esecuzione. Infine, è possibile definire un punto di interruzione (p #n dove #n è il numero di riga) nella riga precedente l'incidente, e controllare i valori (p $variable con $variable il nome della variabile) e cercare di capire perché non funziona.

Con un debugger GUI, dovrebbe essere più facile (per esempio con Visual Studio o Code::blocks).

2021-11-24 08:58:20
0

Quando si dichiara un puntatore a variabile f come float *f; si può solo "usare" se il puntatore è in realtà punta a memoria riservata (il termine è allocato). È possibile assegnare la variabile sul "mucchio" utilizzando il malloc() funzione, o, più facile, creare una variabile distinta in pila (chiamato una variabile automatica) scrivendo float my_float; e l'utilizzo che. Così si ottiene:

float my_startfloat;
float *start_population = &my_startfloat;

Detto questo, mi avrebbe dichiarato un galleggiante (la prima) linea, e poi, eventualmente, usato il suo indirizzo: &my_startfloat. Per esempio:

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

In altre lingue

Questa pagina è in altre lingue

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