를 식별하는 오류를 일으키는 세분화류(중핵을 덤프)

0

질문

나는 c 프로그래밍입니다. 기로 결정 나는 것을 배울 수행하여 문제의 일부 설정에서 cs50 오픈 코스. 다음 코드를 생산하고 세분화류(코어 버)오류가 있습니다. 나는 이유를 이해할 수 없다. 가 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

당신이 선언하는 포인터를 떠나,는 포인터를 지적하는 아무것도 하지 않았기 때문에 할당 주소습니다.

이러한 변경인

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 fault.

2021-11-24 08:35:58
0

다른 대답을 알려줍 솔루션을 강조하고 싶을 찾을 수있는 방법(해결)이런 종류의 문제: 사용 디버거. 그것의 중요한 도구,프로그래머와 그것은 그것을 사용하는 방법을 배우보다 빨리 나중입니다. 이 경우에,당신은 이러한 문제를 간단하게 충분한 것을 쉽게 발견되는 모든 디버거. 나중에 때,작동 될 것입니다 당신은 더 복잡한 코드 및 멀티 스레딩,그것은 그래 그것을 사용하는 방법을 배우는 동안 당신을 시도를 해결하기 위해(복잡한)문제입니다. 십시오려고,이 문제를 해결하기 위해서 자신을 사용하여 디버거.

는 경우에는 리눅스를 사용할 수 있습 gdb 고 코드를 실행될 때까지 충돌합니다. 그 후,당신은 검사 프로그램(bt스)는 마지막으로 실행한 라인입니다. 마지막으로,당신은 정의 중단점(p #n#n 라인 수)이전에 선의 충돌을 검사하는 값(p $variable$variable 의 이름을 변수)을 참조하려고 왜 그것은 작동하지 않습니다.

로 GUI 디버거,그것은 더 쉬워야 한다(예를 들어 Visual Studio 또는 코드::블록).

2021-11-24 08:58:20
0

를 선언할 때 포인터 변수 그래서 같은 f float *f; 할 수 있는 유일한"사용"이것은 경우 포인터 가리키는 메모리에 의해 예약 당신이(용어에 할당되). 할 수 있습을 할당하는 변수에"힙 사용" 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ý
..................................................................................................................