我目前正在尝试在函数指针被分配时发出一些用户提示。我的问题是我无法再次在 main
中获取现在分配的函数指针。
代码如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <time.h>
double print_2 (void);
double print_1 (void);
void promt_user_input(double (*fn)(void));
//program to test funtion pointers inside funtions
//proof of consept
int main(void) {
double result;
double (*fn)(void);
promt_user_input(fn);
//result = *fn;
printf("het %lf",(fn)());
//This will not print no matter what i do.
}
void promt_user_input(double (*fn)(void)) {
int coice;
printf("Enter 1 or 2\n");
scanf(" %d",&coice);
switch(coice) {
case 1: *(&fn) = print_1; printf("you typed 1\n"); break;
case 2: *(&fn) = print_2; printf("you typed 2\n"); break;
default: printf("INVALID INPUT"); break;
}
printf("hi %lf\n",(fn)());
}
double print_1 (void){
printf("This is option 1\n");
return 1;
}
double print_2 (void){
printf("This is option 2\n");
return 2;
}
它编译得很好,并且函数分配正确,因为 prompt_user_input
函数中的 printf
打印了正确的值。但除了该功能之外,它似乎不起作用。 printf
函数甚至不会运行。
最佳答案
在 main()
您定义了指向函数的未初始化指针 fn
的函数然后你将它(通过值)传递给另一个函数 promt_user_input
它通过 print_1
在内部初始化它或print_2
基于用户输入...
但是当流程返回到main()
时,fn
里面main()
保持初始化状态。取消引用它会导致未定义的行为。为了初始化fn
正确地,您需要将其地址传递给 promt_user_input
当然,它的签名必须正确更新(输入参数应该是指向函数的指针类型,或者让它返回函数指针,无论你喜欢什么)。
#include <stdio.h>
double print_2 (void);
double print_1 (void);
void promt_user_input(double (**fn)(void));
int main(void)
{
double result;
double (*fn)(void);
fn = NULL;
promt_user_input(&fn);
if (fn)
{
printf("het %lf",(fn)());
}
return 0;
}
void promt_user_input(double (**fn)(void))
{
unsigned int coice;
int res;
printf("Enter 1 or 2\n");
res = scanf("%u",&coice);
if (res != 1 || !coice || coice > 2)
{
printf("Invalid input!\n");
return;
}
switch(coice)
{
case 1: *fn = print_1; printf("you typed 1\n"); break;
case 2: *fn = print_2; printf("you typed 2\n"); break;
}
printf("hi %lf\n",(*fn)());
}
double print_1 (void)
{
printf("This is option 1\n");
return 1.0;
}
double print_2 (void)
{
printf("This is option 2\n");
return 2.0;
}
一些补充说明:
- 您必须检查
scanf
的返回值处理无效输入。 - 由于输入无效,
fn
将保持未初始化状态,因此在这种情况下您不得取消引用它。您需要初始化fn
到某个无效值,然后在使用之前检查它是否具有有效值或 makepromt_user_input
返回一个状态,指示输入参数是否已成功初始化。 -
double
常量必须有浮点:1-->int
, 1.0 -->double
- 当负值没有意义时,优先使用无符号类型(例如
coice
)。 -
int main(void)
应该返回int
流程结束时的值。
关于c - 将函数指针分配给另一个函数内的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52975430/