问题描述
我想用下面的代码替换下面的switch case语句
switch (n)
{
case 0:
i2c_scan();
break;
case 1:
i2c_read(45);
break;
case 2:
i2c_write(45,5);
break;
default:
printf("\nwrong input\n");
break;
}
请检查以下代码
#include<stdio.h>
void i2c_scan()
{
printf("\ni2c scan\n");
}
void i2c_read(int x)
{
x= x+1;
printf("\ni2c read: %d\n",x);
}
void i2c_write(int x,int y)
{
x=x+y;
printf("\ni2c write:%d\n",x);
}
int main() {
int n;
void (*fun_ptr_arr[])() = {i2c_scan,i2c_read,i2c_write};
(*fun_ptr_arr[0])(45,5); //have put array index to show results,i could have took input from user and put it here like switch case: case number)
(*fun_ptr_arr[1])(45,5);
(*fun_ptr_arr[2])(45,5);
}
输出:
i2c扫描
i2c读取:46
i2c写:50
当我向函数传递更多的参数时,上面的代码如何编译和运行而没有任何错误?以及它如何像i2c_read接受第一个参数并给出结果一样正常工作?
解决方法
当我向函数传递更多的参数时,上面的代码如何编译和运行而没有任何错误?
正如@DanBrezeanu威尔斯所指出的,行为是UB。
可能发生任何事情,包括
显然是“工作正常”。
声明
void (*fun_ptr_arr[])()
表示fun_ptr_arr
是指向以下形式的函数的指针的数组:
void f() { ... }
void g() { ... }
和 不同:
void f(void) { ... }
void g(void) { ... }
This answer详细说明,但要点是:第二种形式是不接受任何参数的函数,而第一种形式则接受任意数量的参数。