如何修复分段错误?

时间:2014-09-04 00:44:58

标签: c loops gcc segmentation-fault sentinel

我正在编写一个C程序,它应该添加每个数字,直到它达到一个标记值。然后将它们全部平均化。

我不确定问题出在哪里,但我认为这可能是数字从未实际发生变化。任何帮助表示赞赏。

#include <stdio.h> 

int sentinal = 9999; 
int iterations = 0; 
int total = 0; 
int average; 
int num; 

int main(void){ 
do{ 
printf("Enter a number to add:\n"); 
scanf("%d\n", num); 
total = total + num; 
iterations++; 
}while (num != sentinal); 

average = total/iterations; 
printf("%d\n", average; 
return 0; 
}

正在运行的版本

#include <stdio.h> 

int main(){ 
int sentinel = 9999; 
int iterations = 0; 
int total = 0; 
float average; 
int num; 

while(1){ 
printf("\nEnter a number to add: "); 
scanf("%d", &num);
if (num == sentinel){
    break;
}else{
total = total + num; 
iterations++;} 
} 

average = (float) total/iterations; 
printf("%f\n", average; 
return 0; 
}

4 个答案:

答案 0 :(得分:2)

你的问题在于:

scanf("%d\n", num); 

scanf需要变量的内存地址,其中应该放置读取的值。这是使用运算符&完成的。你的代码应该是:

scanf("%d\n", &num);

答案 1 :(得分:1)

scanf()获取指向从标准输入解析的值的指针。您传递的是实际值,而不是指向值的指针。

答案 2 :(得分:1)

Linux中有许多工具可以找到分段和其他编译器。如果你想真正调试你的代码弹出分段错误的位置,你可以使用GDB和valgrind。它会准确地给你代码中的错误。

答案 3 :(得分:1)

  1. 使用&存储值时提供地址,即scanf
  2. average声明为float,并在计算average时使用average = (float) total / iterations并在打印%f时使用average
  3. 打印printf时检查average,缺少右括号。