0

所以我已经尝试了几个小时来完成这项任务,但我无法弄清楚,我 99% 确信这与我使用指针的方式有关。我得到的错误是中断0xC0000005:访问冲突写入位置0xCCCCCCCC。我认为这意味着我的一些指针为空。对不起,提前业余代码..

#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);
}
4

5 回答 5

1

对于加载功能,它应该是

void load(int *salary)
{
    printf("Please enter your salary: ");
    scanf("%d", salary);
}
于 2013-10-12T21:46:45.157 回答
1
scanf("%d", *salary);

将其更改为

scanf("%d", salary);

并且printf功能应该是

printf("|     | %d     | %0.2f  | %d    | %d         |\n", *salary, *rate, *raise, *newsalary);
于 2013-10-12T21:46:48.187 回答
0

好在这一行scanf("%d", *salary);,而不是*salary仅仅放salary,所以用这个替换它scanf("%d", salary);

于 2013-10-12T21:47:31.180 回答
0

一般来说,你的问题是你不知道什么时候退出:)

如果某个东西是 type int *,那意味着它是一个指向 an 的指针int,并且没有必要也不正确地转身使用&它,这会将它变成一个指向 int 指针的指针。您多次犯此错误,不仅在其他答案指出的第一个简短函数中,而且在多个地方。当您完成时,您设法将变量salary从 main 转换为指向指向 int 的指针的指针,每次调用另一个函数时添加一个间接级别。

只需跟踪每个功能想要什么。如果一个函数接受 aint*作为参数,并调用另一个需要 a 的函数int*,那么它可以按原样传递变量:您不需要向其添加 a &

于 2013-10-12T21:48:53.130 回答
0

很少有地方使用错误的指针。其他人还没有提到的是:在功能上:

void calc(int *salary, float *rate, int *raise, int *newsalary)
{
    rateofsalary(&salary);
    *raise = *salary/(*rate);
    *newsalary = *raise+*salary;
}

您调用rateofsalarywith &salary,即pointer to pointer to int(int **),但形式参数 ofrateofsalary被声明为int *which is pointer to int

通过引用函数来变量不是最好的主意,不应允许更改该变量。按值传递或将函数参数声明为const.
通过引用传递的整个想法是能够修改传递给函数体内函数的变量,而您似乎错过了指针的实际含义或它们的实际用途。

于 2013-10-12T21:50:53.877 回答