为什么我得到EXC_BAD_ACCESS(代码= 1,地址= 0x0)?

时间:2017-11-16 02:57:40

标签: c xcode

我正在尝试编写一个程序,当给定一定价格时,会将其分解为20s,10s,5s和1s。

但是,我收到以下错误:EXC_BAD_ACCESS (code=1, address=0x0)

错误显示在函数中的*tens=diff行上。 我不明白有什么不对!

以下是代码:

#include<stdio.h>
#include<stdlib.h>

void pay_month(int , int *, int *, int *, int *);

int main(){

int dollars, *twenties=0, *tens=0, *fives=0, *ones=0;

printf("enter amount to pay: ");
scanf("%d",&dollars);

pay_month(dollars, twenties, tens, fives, ones);


return 0;
}
void pay_month(int dollars, int *twenties, int *tens, int *fives, int 
*ones){

int diff=0;
int odolls;

odolls=dollars;


while(dollars%20!=0){
    dollars=dollars-1;
    diff++;
}

*tens=diff;

*twenties=dollars/20;

diff=0;

while(*tens%10!=0){
    *tens=*tens-1;
    diff++;
}

*tens=*tens/10;

*fives=diff;

diff=0;

while(*fives%5!=0){
    *fives=*fives-1;
    diff++;
}

*ones=diff;


diff=0;

while(*ones%1!=0){
    *ones=*ones-1;
    diff++;
}

printf("in %d there is %d twentis %d tens %d fives and %d ones\n",odolls, *twenties, *tens, *fives, *ones); 

}

2 个答案:

答案 0 :(得分:3)

您正在取消引用NULL指针。也就是说,您要求计算机写入内存位置0。你不被允许这样做。

我认为你所做的就是使用指针而不太了解如何获得它们。可能只是为了阻止编译器抛出错误。

这个简单的改变应该可以解决问题:

int dollars, twenties=0, tens=0, fives=0, ones=0;

printf("enter amount to pay: ");
scanf("%d",&dollars);

pay_month(dollars, &twenties, &tens, &fives, &ones);

请注意,调用函数中的任何值都不再是指针。他们只是整数。将&传递给pay_month时,前缀为tens。这是引用运算符,它获取指向值存储位置的指针。

现在,当您取消引用pay_month内的tens指针时,您实际上正在访问{{1}中堆栈中存储值main的内存的相同部分}。

答案 1 :(得分:2)

指针和变量的经典案例

基本上当你将指针声明为

int *twenties=0, *tens=0, *fives=0, *ones=0;

你实际上是把这些指针指向NULL内存,这意味着没有内存分配给那些内存。

解决这个问题的一种方法是将这些变量声明为变量并传递这些变量的地址

int dollars, twenties=0, tens=0, fives=0, ones=0;

pay_month(dollars, &twenties, &tens, &fives, &ones);