app.c 和 main.c 之间,在main.c中调用app.c的static变量和函数,需要利用一个结构体结合指针通过传地址的方式间接访问。
app --------------------------------main
struct { int , func()}作为一种通道或载体
直接上一个代码:
/*main.c*/ #include "common.h" int main(void) { int i; unsigned char cp[8]; FUNC_PTR ptrs; use_func(&ptrs); /*get addr of func(pointer)*/ ptrs.pfunc();/*use the member of struct*/ /*get buff and *length*/ memcpy(cp,ptrs.ptr,*ptrs.length); for(i = 0; i < (int)*ptrs.length; i++) printf("%d-0x%02x ",i,cp[i]); printf("\n"); return 0; }
/*app.c*/ #include "common.h" static unsigned char buff[8]; static int len; static void func(void); static void func(void) { unsigned char temp[8] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}; int i; len = 8; memcpy(buff,temp,len); for(i = 0; i < len; i++) printf("%d-0x%02x ",i,buff[i]); printf("\n"); } void use_func(FUNC_PTR *function) { function->pfunc = func; function->ptr = buff; function->length = &len; }
/*common.h*/ #ifndef _COMMON_H_ #define _COMMON_H_ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> typedef struct structs{ void (*pfunc)(void); unsigned char *ptr; int *length; }FUNC_PTR; extern void use_func(FUNC_PTR *pfunc); #endif
以上三个文件归纳为main.c app.c common.h
结构体里面均为指针,利用一个use_func(FUNC_PTR *pfunc) 进行在app.c 的所有初始化赋值,包括函数指针的指向。
实际上利用如下:
ptrs.pfunc ptrs.ptr ptrs.length 地址 ********** ptrs.pfunc(); memcpy(cp,ptrs.ptr,*ptrs.length);
运行效果如下:
0-0x01 1-0x02 2-0x03 3-0x04 4-0x05 5-0x06 6-0x07 7-0x08 0-0x01 1-0x02 2-0x03 3-0x04 4-0x05 5-0x06 6-0x07 7-0x08
通过static定义,可以通过结构体作为通道基于指针引用。
推广而言,在非static即可直接利用extern引用外部变量或者函数。
但是也可以利用如static的实现方式去处理。
Life is mess, don't let mess mess us.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库