Identifier erreur provoquant l'erreur de Segmentation (core dumped)

0

La question

Je suis nouveau à la programmation en c. J'ai décidé d'apprendre en pratiquant certains des ensembles de problèmes dans le cs50 open courseware. Le code suivant génère une erreur de Segmentation (core dumped) erreur. Je ne comprends pas pourquoi. J'ai lu une erreur de segmentation a à voir avec accès à la mémoire, que vous n'avez pas accès. Je ne vois pas ce qui pourrait causer cela. Je suis en supposant qu'il a à faire avec les pointeurs. Je suis nouveau sur les pointeurs. Je vous remercie.

    #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

Vous avez déclaré un pointeur sur float, mais le pointeur juste fait rien parce que vous n'avez pas attribuer d'adresse à elle.

Modifier ces lignes

float *start_population;
float *end_population;

pour

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

pour résoudre l'erreur de segmentation.

2021-11-24 08:35:58
0

Tandis que l'autre réponse vous indique la solution, je veux souligner que la façon de trouver (et résoudre) ce genre de problèmes: l'utilisation d'un débogueur. C'est un important outil de programmeur, et il est préférable d'apprendre à l'utiliser plus tôt que plus tard. Dans ce cas, votre problème est assez simple pour être facilement trouvé avec toute débogueur. Plus tard, lorsque vous travaillez avec un code plus complexe et multi-threading, il va être difficile d'apprendre à l'utiliser pendant que vous essayez de résoudre votre (complexe) d'un problème. S'il vous plaît, essayez de résoudre ce problème dans votre propre en utilisant un débogueur.

Si vous êtes sous Linux, vous pouvez utiliser gdb et exécuter le code jusqu'à ce qu'il se bloque. Ensuite, vous inspectez le backtrace (bt) voir le dernier exécuté la ligne. Enfin, vous définissez un point d'arrêt (p #n#n est le numéro de la ligne) dans la ligne précédente de l'accident, et vous examinez les valeurs (p $variable avec $variable le nom de votre variable) et essayer de voir pourquoi ça ne marche pas.

Avec une interface graphique débogueur, il devrait être plus facile (par exemple avec Visual Studio ou Code::blocks).

2021-11-24 08:58:20
0

Lorsque vous déclarez un pointeur de variable f comme float *f; vous ne pouvez "utiliser" si le pointeur est en fait pointant vers la mémoire réservée par vous (le terme est alloué). Vous pouvez allouer de la variable sur le "tas", à l'aide de la malloc() fonction, ou, plus facilement, créer une variable sur la pile (appelée variable automatique) par écrit float my_float; et en les utilisant. Ainsi, vous obtenez:

float my_startfloat;
float *start_population = &my_startfloat;

Cela dit, j'aurais seulement déclaré un flotteur (la première) ligne, puis, le cas échéant, utilisé son adresse: &my_startfloat. Par exemple:

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

Dans d'autres langues

Cette page est dans d'autres langues

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