c - 将函数指针分配给另一个函数内的函数

标签 c function pointers

我目前正在尝试在函数指针被分配时发出一些用户提示。我的问题是我无法再次在 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;
}

一些补充说明:

  1. 您必须检查 scanf 的返回值处理无效输入。
  2. 由于输入无效,fn将保持未初始化状态,因此在这种情况下您不得取消引用它。您需要初始化 fn到某个无效值,然后在使用之前检查它是否具有有效值或 make promt_user_input返回一个状态,指示输入参数是否已成功初始化。
  3. double常量必须有浮点:1--> int , 1.0 --> double
  4. 当负值没有意义时,优先使用无符号类型(例如 coice )。
  5. int main(void)应该返回 int流程结束时的值。

关于c - 将函数指针分配给另一个函数内的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52975430/

相关文章:

c++ - 在 shared_ptr 容器中查找元素?

c - 指针或值

c - C 中 2 的负幂

c++ - 对不同参数执行相同操作的函数

c - 递归下降解析器C程序

c - 编写一个函数来检查关系语句是真还是假

javascript - 用于突出显示功能的更高效的 JavaScript 代码?

android - 带或不带括号的 JNIEnv 用法?

c - 打印矩阵

c - 理解 for 循环中的 fork()