我不认为我正确使用指针。 C

时间:2013-10-12 21:45:05

标签: c

所以我一直试图做这个任务几个小时,我无法弄明白,我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);
}

5 个答案:

答案 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调用&salarypointer to pointer to int(int **),但rateofsalary的正式参数声明为int *pointer to int {1}}。

通过引用函数进行变量不是最好的想法,不应该允许更改该变量。按值传递或将函数参数声明为const 通过引用传递的整个想法是能够修改传递给函数体内函数的变量,并且您似乎缺少实际使用它们的指针或实际使用它们。