Identificar error causando segmentation fault (core objeto de dumping)

0

Pregunta

Soy nuevo en c programación. Decidí aprender haciendo algunos de los conjuntos de problemas en el cs50 open courseware. El código siguiente genera un error de Segmentación (colapsaba) error. No puedo entender por qué. He leído un error de segmentación tiene que ver con el acceso a memoria no tiene acceso. No veo qué podría estar causando eso. Supongo que tiene que ver con los punteros. Soy nuevo a los punteros. Gracias.

    #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

Se declara un puntero a float, pero que en puntero apuntando a la nada porque no asignar la dirección a él.

El cambio de estas líneas

float *start_population;
float *end_population;

a

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

debe resolver el fallo de segmentación.

2021-11-24 08:35:58
0

Mientras que la otra respuesta le dice a usted la solución, quiero hacer hincapié en la manera de encontrar (y resolver) este tipo de problemas: el uso de un depurador. Es una herramienta importante de un programador, y es mejor aprender a usar lo más pronto que tarde. En este caso, el problema es lo suficientemente simple para ser encontrados fácilmente con cualquier depurador. Más tarde, cuando usted va a trabajar con código más complejo y multi-threading, que va a ser difícil aprender a usarlo mientras se intenta resolver su (complejo) problema. Por favor, tratar de resolver este problema en su propia mediante el uso de un depurador.

Si estás en Linux, puede utilizar gdb y ejecutar el código hasta que se bloquea. A continuación, inspeccione la traza (bt) para ver la última línea ejecutada. Por último, se define un punto de interrupción (p #n donde #n es el número de línea) en la línea anterior de la caída, y a inspeccionar los valores (p $variable con $variable el nombre de la variable) y tratar de ver por qué no funciona.

Con una interfaz gráfica de usuario depurador, debería ser más fácil (por ejemplo con Visual Studio o con Code::blocks).

2021-11-24 08:58:20
0

Cuando se declara una variable puntero f como float *f; sólo se puede "usar" si el puntero es en realidad apunta a la memoria reservada por usted (el término es asignado). Puede asignar la variable en el "heap" el uso de la malloc() la función, o, más fácil, crear una variable independiente en la pila (que se llama una variable automática) por escrito float my_float; y el uso que. Así se obtiene:

float my_startfloat;
float *start_population = &my_startfloat;

Dicho esto, yo sólo habría declarado un flotador (la primera) de la línea, y luego, cuando proceda, utilizar su dirección: &my_startfloat. Por ejemplo:

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

En otros idiomas

Esta página está en otros idiomas

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