菜缤的世界 CairBin's Blog - 回调函数
type: channel
link: https://blog.cairbin.top/index.php/tag/回调函数/
items: C语言回调函数

C语言回调函数
type: item
date: 2023-04-24T14:33:04+00:00
description: C语言回调函数什么是回调函数在计算机程序设计中，回调函数，或简称回调（call），是指通过函数参数传递到其它代码的，某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。如何实现回调函数在C语言中可以通过函数指针来实现函数的回调。函数指针基础知识可参考《C语言函数指针》—CairBin's Blog。代码实现如下：回调函数这里实际上用了void指针实现泛型，注意void指针不能直接获取内存中存放的值，你需要强制转换成对应类型的指针才行。这部分知识可以参考之前的文章《C语言void类型指针》void* callback(void* arg){ int* pt = (int*)arg; printf("%d\n",*pt); return NULL; }那么问题来了，如果我们想要返回一个参数该怎么办呢？注意这个函数的返回类型是个void指针，通过它来获取返回值。这里需要注意一点，返回的指针指向的内存区域存放的不能是个局部变量，它的内存在函数结束时将要被回收。所以你需要用malloc去开辟这块内存区域。//错误的用法 void* callback(void* arg){ int* pt = (int*)arg; printf("%d\n",*pt); int b = 10; int *p = &b; return (void*)p; } //正确的用法 void* callback(void* arg){ int* pt = (int*)arg; printf("%d\n",*pt); int *b = (int*)malloc(sizeof(int)); *b = 10; int *p = b; return (void*)p; }关于malloc的使用可参考文章《C语言malloc与calloc》需要调用回调函数的函数void test(void*(*callback)(void*),void* arg) { printf("HelloWorld\n"); callback(arg); }main函数int main(){ int a = 3; test(&callback,&a); return 0; }我们来编译执行下gcc main.c -o main && ./main输出结果如下HelloWorld 3完整代码#include <stdio.h> void* callback(void* arg){ int* pt = (int*)arg; printf("%d\n",*pt); } void test(void*(*callback)(void*),void* arg) { printf("HelloWorld\n"); callback(arg); } int main(){ int a = 3; test(&callback,&a); return 0; }