有函数指针和数组的麻烦

时间:2015-10-10 01:51:17

标签: c

我目前正在使用Visual Studios上课,不用说我很难理解指针。我创建了一个程序,但似乎不适合我。单击我想要的函数类型后,我不断收到断言错误。我得到一个Debug断言失败弹出错误。表达式:result_pointer!= nullptr。它说1558行

int function1(int a,int b);
int function2(int a, int b);
int function3(int a, int b);

int(*p[3])(int x, int y);

int main()
{

    int num1, num2;
    int choice = 0;

    p[0] = function1;
    p[1] = function2;
    p[2] = function3;

    printf("Please enter two numbers: ");
    scanf_s("%d", &num1);
    scanf_s("%d", &num2);
    printf("Which would you like to try (1 for Math, 2 for Subtraction, 3 for Multiplication): \n");
    scanf_s("%d", choice);
    int (*i) = &choice;

    while (*i >= 0 && *i < 3) {
        (p[*i])(num1,num2);
    }

puts("Program execution compiled");
}
int function1(int a, int b) 
{
    int total;
    total = a + b;
    return total;

}
int function2(int a, int b) 
{
    int total;
    total = a - b;
    return total;
}
int function3(int a, int b) 
{
    int total;
    total = a * b;
    return total;
}

1 个答案:

答案 0 :(得分:2)

这就是您的代码失败的原因:

scanf_s("%d", choice);

您忘记使用运营商&的地址。

scanf_s("%d", &choice);

当然,你的代码还有很多其他的怪癖。

例如,

  1. 为什么使用int (*i) = &choice;?仅仅采用choice并减去1会更有意义吗?无需使用指针int i = choice - 1
  2. 您的循环将执行循环体,直到i小于零或大于2,如果输入的输入正确,则永远不会。考虑选择另一个循环条件,或者使用if语句交换循环。
  3. 您无法显示该功能的返回值。试试这样的事情printf("%d\n", (p[i])(num1,num2)(假设你已经修复了i是指针的事情)