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

Far*_*ris -2 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);


}
Run Code Online (Sandbox Code Playgroud)

我跑的时候得到:

请输入提款金额:1500

分段故障(核心转储)

Dev*_*lar 6

scanf()期望指针作为参数.注意&传递地址amount,而不是它的价值.

scanf( "%d", &amount );
Run Code Online (Sandbox Code Playgroud)

你的程序接受amount(尚未初始化),并写入你输入的解释为一个内存地址的数值上-这是一个无效的访问,使程序崩溃.

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

启用相关的编译器警告应该警告您有关未经授权的使用amount,甚至可能是调用中的类型不匹配scanf().

此外,你应该检查返回值scanf(),以确保它实际上已成功,或amout仍然未初始化(例如,当用户输入字母而不是数字).