ระบุตัวทำให้เกิดข้อผิดพลาด Segmentation ความผิด(core อทิ้ง)

0

คำถาม

ฉันยังใหม่กั c ตั้งการทำงานไว้เอง ฉันตัดสินใจจะเรียนรู้ด้วยการทำบางอย่างของปัญหาตั้งค่าใน cs50 เปิด courseware. การต่อรหัสได้เป็น Segmentation ความผิด(core ทิ้ง)ข้อผิดพลาด ฉันไม่สามารถเข้าใจแล้วว่าทำไม ฉันอ่านหนังสือ segmentation เกิดข้อผิดพลาดต้องมีส่วนเกี่ยวข้องกับเข้าถึงความทรงจำคุณไม่สามารถเข้าถึงได้ ฉันไม่เห็นว่าอะไรเป็นสาเหตุที่ก่อให้เกิดนั้น ฉันคิดว่ามันต้องมีส่วนเกี่ยวข้องกับคนชี้ประเด็น. ฉันเป็นคนใหม่ที่ชี้ประเด็น. ขอบคุณ

    #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

คุณประกาศเป็น pointer ต้องลอยแต่นั่น pointer แค่ชี้ให้เห็นจะไม่มีอะไรเพราะว่าคุณไม่ได้กำหนดที่อยู่ของเพื่อมัน

เปลี่ยนพวกนี้บรรทัด

float *start_population;
float *end_population;

ต้อง

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

ควรจะแก้ปัญหา segmentation นผิดเอง

2021-11-24 08:35:58
0

ในขณะที่อีกคนหนึ่งตอบคำบอกคุณทางออกที่ฉันอยาก emphasize ทางเพื่อค้นหา(และไขคดีนี้เป็นของปัญหา: ใช้วดีบั. มันเป็นสิ่งสำคัญอเครื่องมือของโปรแกรมเมอร์และมันเป็นสิ่งที่ดีที่สุดที่จะเรียนรู้ที่จะใช้มันเร็วกว่าที่คิด ในกรณีนี้ปัญหาของคุณมันง่ายมามากพอที่จะเป็นอย่างง่ายดายเจอกับเรื่องพวดีบั. ต่อมาเมื่อคุณต้องทำงานกับซับซ้อนมากขึ้นรหัสแล้วหลายการอ่านจดหมามันจะต้องเป็นเรื่องยากที่จะเรียนรู้ที่จะใช้มันในขณะที่คุณพยายามแก้ปัญหาของคุณ(ซับซ้อน)ปัญหาแล้ว ได้โปรดพยายามจะแก้ไขเรื่องนี้ปัญหาของตัวเองโดยการใช้ควดีบั.

ถ้าคุณอยู่ในระบบลินุกซ์คุณสามารถใช้ name และวิ่งรหัสจนกว่ามันทำงานขัดข้อง. งั้นคุณตรวจสอบที่ backtrace(btที่จะเห็นคนสุดท้ายถูกประหารรทัด. Lastly คุณกำหนดจุดหยุด(p #n อยู่ไหน #n เป็นเส้นตัวเลข)ในบรรทัดก่อนหน้าของเหตุการณ์ตอนชนแล้วคุณตรวจสอบค่า(p $variable กับ $variable ชื่อของของตัวแปร)และพยายามที่จะเห็นว่าทำไมมันไม่ได้ผลหรอก

กับส่วนติดต่อผู้ใช้แบบวดีบัมันต้องออกง่ายขึ้น(สำหรับตัวอย่างกับเห็นสตูดิโอหรือรหัส::ช่วงตึก).

2021-11-24 08:58:20
0

ตอนที่คุณประกาศเป็น pointer ตัวแปร f อย่างงั้น float *f; คุณสามารถเท่านั้น"ให้ใช้"มัถ้า pointer คือ ที่จริง ชี้ไปหาความทรงจำไว้โดยคุณ(คำคือกำ). คุณสามารถเหมือนกั allocate งตัวแปรม"ชื่นชม"ใช้ malloc() ฟังก์ชันหรือง่ายขึ้นสร้างแยกตัวแปรในงาน(เรียกว่าเป็นอัตโนมัติตัวแปร)ด้วยการเขียน float my_float; และใช้มัน. งั้นคุณต้อง:

float my_startfloat;
float *start_population = &my_startfloat;

นั่นบอกว่าฉันจะมีเพียงประกาศให้(คนแรก)สายแล้ว,ที่ไหนที่เหมาะสมที่เคยองที่อยู่: &my_startfloat. สำหรับตัวอย่าง:

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

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่