【问题标题】:Trouble understanding the use of void (*fptr)(void) pointer in an array of void无法理解在 void 数组中使用 void (*fptr)(void) 指针
【发布时间】:2019-03-07 00:55:41
【问题描述】:

我无法理解应该易受攻击的 C 程序的代码。

我们有这个定义typedef void (*fptr)(void);,我留下上面的部分代码。我在理解指令fptr p = pat_on_back; 时完全没有问题,它只是定义了一个 fptr 指针,该指针指向一个永远不会执行的函数,因为该指令只是定义并初始化了一个指针(对吗?)。

我的问题是理解指令fptr ptrs[3] = { NULL, get_wisdom, put_wisdom };。当 fptr 类型明显用于声明和初始化 void 数组时,这条指令是如何工作的?不应该只接收一个 void 参数吗?

就此而言,get_wisdom() 和 put_wisdom() 函数都接收和返回 void。这个小程序是填充和打印一个简单的字符链表,称为“智慧”。 get_wisdom() 和 put_wisdom() 函数完全按照它看起来的样子做。

char greeting[] = "Hello there\n1. Receive wisdom\n2. Add wisdom\nSelection >";
char prompt[] = "Enter some wisdom\n";
char pat[] = "Achievement unlocked!\n";
char secret[] = "secret key";

typedef void (*fptr)(void);

void pat_on_back(void) {
  write(outfd, pat, sizeof(pat));
  return;
}

void put_wisdom(void) {
  . . .
}

void get_wisdom(void) {
  . . .
} 

fptr  ptrs[3] = { NULL, get_wisdom, put_wisdom };

int main(int argc, char *argv[]) {

  while(1) {
      char  buf[1024] = {0};
      int r;
      fptr p = pat_on_back;
      r = write(outfd, greeting, sizeof(greeting)-sizeof(char));
      if(r < 0) {
        break;
      }
      r = read(infd, buf, sizeof(buf)-sizeof(char));
      if(r > 0) {
        buf[r] = '\0';
        int s = atoi(buf);
        fptr tmp = ptrs[s];
        tmp();
      } else {
        break;
      }
  }

  return 0;
}

【问题讨论】:

  • fptr 是一种类型。 ptrs[3] 是该类型的数组。据推测,get_wisdomput_wisdom 与该类型兼容。并且类型不是void。类型为“指向不带参数且不返回任何内容的函数的指针”.
  • 空数组是什么意思?你的问题不清楚。请澄清。
  • 我认为他/她的意思是get_wisdom是一个函数指针,它指向一个可能被定义为“void get_wisdom(void);”的函数。 ptrs[3] 是一个相同类型(定义)的函数指针数组。
  • @user3386109 但是 { NULL, get_wisdom, put_wisdom } 是一个数组,而不是一个函数,不是吗?抱歉,如果这听起来很愚蠢。
  • 没有“虚空数组”这种东西

标签: c


【解决方案1】:
typedef void (*fptr)(void);

将 fptr 类型定义为一个指向函数的指针,该函数返回一个 指定类型的值(void)并需要指定的参数(void)

fptr  ptrs[3] = { NULL, get_wisdom, put_wisdom };

将 ptrs 定义为 3 个元素的向量,每个元素都是指向一个元素的指针 以 void 作为参数(任何东西)并返回 void 的函数。

  • ptrs[0] = NULL;第一个指针指向 NULL。
  • ptrs[1] = get_wisdom;第二个指针指向函数“get_wisdom”。
  • ptrs[2] = put_wisdom;这 第三个指针指向函数“put_wisdom”。

【讨论】:

    猜你喜欢
    • 2014-05-30
    • 2020-04-01
    • 1970-01-01
    • 2016-09-07
    • 2023-03-04
    • 2013-12-18
    • 2016-11-23
    • 1970-01-01
    • 2012-02-07
    相关资源
    最近更新 更多