该程序要求金额并打印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
分段错误(核心转储)
答案 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);
//----------^