gpt4 book ai didi

c - 无法理解 void (*fptr)(void) 指针在 void 数组中的使用

转载 作者:行者123 更新时间:2023-11-30 14:41:20 26 4
gpt4 key购买 nike

我无法理解应该存在漏洞的 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。这个小程序是填充并打印一个简单的字符链接列表,称为“wisdom”。函数 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;
}

最佳答案

typedef void (*fptr)(void);

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

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

将 ptr 定义为包含 3 个元素的 vector ,每个元素都是指向一个元素的指针以 void 作为参数(任何内容)并返回 void 的函数。

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

关于c - 无法理解 void (*fptr)(void) 指针在 void 数组中的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55034461/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com