该程序要求金额并打印其制作的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
分段故障(核心转储)
scanf()期望指针作为参数.注意&传递地址的amount,而不是它的价值.
scanf( "%d", &amount );
Run Code Online (Sandbox Code Playgroud)
你的程序接受值的amount(尚未初始化),并写入你输入的解释为一个内存地址的数值上-这是一个无效的访问,使程序崩溃.
在过去,内存保护是通过"段"完成的,而错误的内存访问导致了"分段错误".错误消息幸存了下来.核心内存的内容 - 即处于当前状态的程序 - 已被转储到磁盘(名为"core"的文件中).这可以用于调试.这种转储是可选的,并且(在Unix上)通过控制ulimit -c,因此您可能还会看到没有 "(核心转储)"部分的Segfault .(而"核心记忆"就像"分割错误"一样是另一种时代错误.)
启用相关的编译器警告应该警告您有关未经授权的使用amount,甚至可能是调用中的类型不匹配scanf().
此外,你应该检查返回值scanf(),以确保它实际上已成功,或amout将仍然未初始化(例如,当用户输入字母而不是数字).