识别错误造成的分割故障(核心倾倒)

0

的问题

我是新来的c节目。 决定我会学会做的一些问题集中的计算机科学50开放式课件。 以下代码产生了分割的故障(核心倾销)的错误。 我不明白为什么。 我读过一个分割的错误做访问记忆你没有访问。 我看不到会是什么引起的。 我假设它的指针。 我是新来的指针。 谢谢你。

    #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;

应该解决分割的错误。

2021-11-24 08:35:58
0

而其他的答案告诉你的解决方案,我要强调的方法来找到(和解决)这样的问题: 使用一个调试器. 这是一个重要工具的一个程序员,并最好是学会使用它早于后。 在这种情况下,你的问题是简单的,足以容易地被发现的任何调试器。 后来,当你将工作与更复杂的代码和多线程,这会是难以学习使用它,而你试图解决你的(复数)的问题。 拜托,试图解决这个问题在自己通过使用一个调试器。

如果你是在Linux,可以使用 和运行代码,直到它的崩溃。 然后,你检查的回溯追踪(bt)以看到最后的执行的路线。 最后,需要定义一个断点(p #n 哪里 #n 是符号)的前线的崩溃,以及检查的数值(p $variable$variable 名称的变量)和尝试看看为什么它不工作。

与GUI调试器,它应该会更容易(例如有些工作室或代码::块)。

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