Segmentasyon hatasına neden olan hatayı tanımlayın (çekirdek dökümü)

0

Soru

C programlamada yeniyim. Cs50 açık ders yazılımındaki bazı sorun kümelerini yaparak öğreneceğime karar verdim. Aşağıdaki kod Segmentasyon hatası (çekirdek dökümü) hatası üretir. Anlayamıyorum. Bir segmentasyon hatasının, erişemediğiniz belleğe erişmekle ilgili olduğunu okudum. Ama neden, ne olacağını görmüyorum. Bunun işaretçiler ile ilgisi olduğunu varsayıyorum. İşaretçiler konusunda yeniyim. Teşekkür ederim.

    #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

Kayan nokta için bir işaretçi bildirdiniz, ancak bu işaretçi hiçbir şeye işaret etmedi çünkü ona adres atamadınız.

Bu satırları değiştir

float *start_population;
float *end_population;

-e doğru

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

segmentasyon hatasını çözmelidir.

2021-11-24 08:35:58
0

Diğer cevap size çözümü anlatırken, bu tür sorunları bulmanın (ve çözmenin) yolunu vurgulamak istiyorum: bir hata ayıklayıcı kullanın. Bir programcının önemli bir aracıdır ve er ya da geç kullanmayı öğrenmek en iyisidir. Bu durumda, sorununuz herhangi bir hata ayıklayıcıyla kolayca bulunabilecek kadar basittir. Daha sonra, daha karmaşık kod ve çoklu iş parçacığıyla çalışacağınız zaman, (karmaşık) sorununuzu çözmeye çalışırken onu kullanmayı öğrenmek zor olacaktır. Lütfen, bir hata ayıklayıcı kullanarak bu sorunu kendi başınıza çözmeye çalışın.

Linux'taysanız, gdb'yi kullanabilir ve kodu çökene kadar çalıştırabilirsiniz. Ardından, backtrace'i inceleyin (bt) son yürütülen satırı görmek için. Son olarak, bir kesme noktası tanımlarsınız (p #n nerede #n kilitlenmenin önceki satırındaki satır numarasıdır) ve değerleri incelersiniz (p $variable ile $variable değişkeninizin adı) ve neden çalışmadığını görmeye çalışın.

Bir GUI hata ayıklayıcısıyla daha kolay olmalıdır (örneğin Visual Studio veya Code::blocks ile).

2021-11-24 08:58:20
0

Böyle bir işaretçi değişkeni f bildirdiğinizde float *f; yalnızca işaretçi gerçekten sizin tarafınızdan ayrılmış belleğe işaret ediyorsa (terim tahsis edilmişse) "kullanabilirsiniz". Değişkeni kullanarak "yığın" üzerinde tahsis edebilirsiniz malloc() işlev veya daha kolay, yazarak yığında (otomatik değişken olarak adlandırılır) ayrı bir değişken oluşturun float my_float; ve bunu kullanarak. Böylece elde edersiniz:

float my_startfloat;
float *start_population = &my_startfloat;

Bununla birlikte, yalnızca bir float (ilk) satırını bildirirdim ve sonra uygun olduğunda adresini kullanırdım: &my_startfloat. Örneğin:

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

Diğer dillerde

Bu sayfa diğer dillerde

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