分段错误(核心转储)C lang

时间:2014-09-15 07:22:52

标签: c

该程序要求金额并打印500&的数量。 100张票据由

制成
#include <stdio.h>
int main(void){



  int no500,no100,amount;

  printf("please enter amount to withdraw :");
  scanf("%d",amount);
  void function(int a,int*x, int*y){
   *x= a/500;
   *y=(a%500)/100;

}
  function(amount,&no500,&no100);
 printf("the number of 500 bills  %d\n ",no500);
printf("the number of 100 bills  %d\n ",no100);


}

当我跑步时我得到:

请输入提款金额:1500

分段错误(核心转储)

2 个答案:

答案 0 :(得分:6)

scanf()期望指针作为参数。请注意&传递amount地址,而非其值。

scanf( "%d", &amount );

您的程序获取amount(尚未初始化),并将您输入的数字写入解释为内存地址的值 - 这是无效访问,使程序崩溃。

在过去,内存保护是通过“段”完成的,而错误的内存访问导致了“分段错误”。错误消息幸存了下来。核心内存的内容 - 即处于当前状态的程序 - 已被转储到磁盘(名为“core”的文件中)。这可以用于调试。此转储是可选的,并且(在Unix上)通过ulimit -c控制,因此您可能还会看到Segfault 没有“(核心转储)”部分。 (而“核心记忆”就像“分割错误”一样是另一种时代错误。)

启用相关的编译器警告应警告您amount的未经授权使用,甚至可能在调用scanf()时出现类型不匹配。

此外,您检查scanf()的返回值,以确保其确实成功,或amout 未初始化(例如当用户输入字母而不是数字时。)

答案 1 :(得分:0)

你错过了&

scanf("%d",amount);

应该是

scanf("%d", &amount);
//----------^