所以我一直试图做这个任务几个小时,我无法弄明白,我99%肯定它与我如何使用指针有关。我得到的错误是一个中断0xC0000005:访问冲突写入位置0xCCCCCCCC.which我认为我的一些指针是null。对不起业余代码提前..
#include<stdio.h>
void load(int *salary)
{
printf("Please enter your salary: ");
scanf("%d", *salary);
}
void calc(int *salary, float *rate, int *raise, int *newsalary)
{
rateofsalary(&salary);
*raise = *salary/(*rate);
*newsalary = *raise+*salary;
}
float rateofsalary(int *salary)
{
float rate;
if(*salary<0 && *salary>=30000)
rate = 7.0;
else
if(*salary<30000 && *salary>=40000)
rate = 5.5;
else
if(*salary<40000)
rate = 4.0;
return rate;
}
void print(int *salary, float *rate, int *raise, int *newsalary)
{
printf("| | Salary | Rate % | Raise | New Salary |\n");
printf("| | %d | %0.2f | %d | %d |\n", salary, rate, raise, newsalary);
}
void main()
{
int salary, raise, newsalary;
float rate;
load(&salary);
rateofsalary(&salary);
calc(&salary, &rate, &raise, &newsalary);
print(&salary, &rate, &raise, &newsalary);
}
答案 0 :(得分:1)
对于加载函数它应该是
void load(int *salary)
{
printf("Please enter your salary: ");
scanf("%d", salary);
}
答案 1 :(得分:1)
scanf("%d", *salary);
将其更改为
scanf("%d", salary);
并且printf
函数应为
printf("| | %d | %0.2f | %d | %d |\n", *salary, *rate, *raise, *newsalary);
答案 2 :(得分:0)
在这一行scanf("%d", *salary);
而不是*salary
,只需添加salary
,然后将其替换为此scanf("%d", salary);
答案 3 :(得分:0)
一般来说,您的问题是您不知道何时退出:)
如果某些内容属于int *
类型,则表示它是指向int
的指针,转而使用&
并将其转换为指向int的指针。你多次犯了这个错误,不仅在第一个短函数中,正如其他答案所指出的那样,而是在多个地方。您设法将变量salary
从main转换为指向指向int的指针的指针,在您每次调用另一个函数时添加间接级别。
只需跟踪每个功能的需求。如果函数接受int*
作为参数,并调用另一个需要int*
的函数,那么它可以按原样传递变量:您不需要添加{{1对它来说。
答案 4 :(得分:0)
您使用指针的地方很少。其他人没有提到的是:
在功能:
void calc(int *salary, float *rate, int *raise, int *newsalary)
{
rateofsalary(&salary);
*raise = *salary/(*rate);
*newsalary = *raise+*salary;
}
您使用rateofsalary
调用&salary
,pointer to pointer to int
(int **),但rateofsalary
的正式参数声明为int *
,pointer to int
{1}}。
通过引用函数进行变量不是最好的想法,不应该允许更改该变量。按值传递或将函数参数声明为const
通过引用传递的整个想法是能够修改传递给函数体内函数的变量,并且您似乎缺少实际使用它们的指针或实际使用它们。