Tag: function pointers

更改函数指针的地址值

我在C中有以下代码: int addInt(int n, int m) { return n + m; } int (*functionPtr)(int, int); functionPtr = &addInt; functionPtr是一个函数指针,它指向函数addInt的特定地址。 我想改变它的1位值,但我无法弄清楚如何。 假设functionPtr在最后一个语句之后指向0xABC0 (假设一个16位地址)。 我想将其值更改为0xABC1 。 我试图将值与0x1进行OR运算,但我猜操作数转换有问题: functionPtr = &addInt | 0x00000001; // addresses are of 32 bits 我知道乱搞指针是有风险的,但我必须更改地址的LSB才能进入ARM Cortex-M4 MCU的Thumb状态。

将函数指针转换为void会产生什么影响?

所以我想第64次写一个缓冲库,我开始进入一些非常先进的东西。 以为我会就此问一些专业的意见。 在我的第一个头文件中,我有这个: typedef struct StdBuffer { void* address; } StdBuffer; extern void StdBufferClear(StdBuffer); 在#includes第一个头文件的另一个头文件中,我有这个: typedef struct CharBuffer { char* address; } CharBuffer; void (*CharBufferClear)(CharBuffer) = (void*) StdBufferClear; 声明此函数指针void是否会干扰调用? 它们具有值签名匹配。 我以前从未见过一个声明为void的函数指针,但它是让它干净地编译的唯一方法。 Stackwise它不应该与我在汇编编码中学到的东西有任何区别。 毫无意义的 OMG! 我刚才在StackOverflow上说Stackwise! 嗯..看起来我在这里假设太多了。 请允许我重新说明我是否可以。 我不关心地址中存储的“类型”数据。 我所关心的只是一个“单位”的大小以及该地址有多少单位。 如果您愿意,请查看API的接口协议合同: typedef struct StdBuffer { size_t width; ///< The number of bytes that complete a data […]

使用Swig的JNI for C和函数指针回调的麻烦

我们在java中加载的一个库中有一个C函数,它接受一个函数指针 function定义如下 typedef char int8 typedef unsigned short uint16 uint32 poll_broadcasts(void *(pfn)(int8*,uint16)); 在C中,它如下使用 void handle_broadcasts( int8 *broadcast, uint16 length ) uint32 a = poll_broadcasts( (void*(*)(int8*,uint16)) handle_broadcasts ) 但是当您使用Swig生成JNI包装器时,它会为poll_broadcast创建以下定义 public static long poll_broadcasts(SWIGTYPE_p_f_p_char_unsigned_short__p_void pfn) { return TestJNI.poll_broadcasts(SWIGTYPE_p_f_p_char_unsigned_short__p_void.getCPtr(pfn)); } 按照答案 我应该如何编写.i文件来包装Java或C#中的回调 试过下面 test.h void * data; typedef void* (*callback_handle_broadcast_t)(int8*, uint16); static callback_handle_broadcast_t handle_broadcast; static void set_handle_broadcast(callback_handle_broadcast_t cb, […]

为什么将“extern puts”转换为函数指针“(void(*)(char *))&puts”?

我正在查看来自不安全编程的示例abo3.c ,并且我没有在下面的示例中讨论转换。 有人可以开导我吗? int main(int argv,char **argc) { extern system,puts; void (*fn)(char*)=(void(*)(char*))&system; char buf[256]; fn=(void(*)(char*))&puts; strcpy(buf,argc[1]); fn(argc[2]); exit(1); } 那么 – 系统和投放的铸造是什么? 他们都返回一个int所以为什么把它变成无效? 我非常感谢对整个计划的解释。 [编辑] 谢谢你们的投入! Jonathan Leffler ,实际上代码有“坏”的原因。 它应该是可利用的,溢出缓冲区和函数指针等.mishou.org有一篇关于如何利用上述代码的博客文章。 其中很多仍然在我头上。 bta ,我从上面的博客文章中得知,转换系统会以某种方式阻止链接器删除它。 有一点不能立即明确的是系统和放置地址都写在同一个位置,我想这可能是gera所说的“因此链接器不会删除它”。 虽然我们讨论的是函数指针的主题,但现在我想问一个后续问题,即语法更清晰。 我正在使用函数指针查看一些更高级的示例,偶然发现这个令人厌恶的例子,取自托管shellcode的站点。 #include char shellcode [] =“some shellcode”; int main(void) { fprintf(stdout,“长度:%d \ n”,strlen(shellcode)); (*(void(*)())shellcode)(); } 所以数组被强制转换为返回void的函数,引用并调用? 这看起来很讨厌 – 所以上面代码的目的是什么? [/编辑]

C:typedef结构中的函数指针

我试图在C中创建一个链接列表,但试图在一些C ++样式类中很好地打包它。 我有一些问题,但在C中使用函数指针。 typedef struct linkedList { int count; struct msgNode *front; struct msgNode *back; void (*addMSG)(unsigned char *, int, struct linkedList *); } msgList; void addMSG(unsigned char *data, int size, struct linkedList *self); 理想情况下,我希望你可以让你列出然后添加你可以简单地在结构中调用一个“方法”(函数),模拟你在C ++中看到的行为。 当我调用addMSG时,我得到了一个分段错误,当然这是因为addMSG没有指向一个函数。 但是,我不想指定一个函数指向我想要使用链表的每一次。 有没有很好的方法来获得函数指针而不必隐式地指向函数,或者你是否必须隐式地指向函数? 这只是这里显示的部分实现。 最后,这个结构将具有所有必要的function。 这只是为了让这个问题简短而重要。

在C中取消引用函数指针以访问CODE内存

我们在这里处理C. 我只是有了这个想法,想知道是否有可能访问存储函数的内存点,比如说foo并将函数的内容复制到内存中的另一个点。 具体来说,我试图让以下工作: #include #include #include void foo(){ printf(“Hello World”); } int main(){ void (*bar)(void) = malloc(sizeof foo); memcpy(&bar, &foo, sizeof foo); bar(); return 0; } 但运行它会出现总线错误: Bus error: 10 。 我正在尝试将函数foo的内容复制到内存bar空间,然后执行新创建的functionbar 。 除了查看这样的事情是否可能之外,没有其他原因可以揭示C语言的复杂性。 我没想到这有什么实际用途。 我正在寻找指导让这个工作,或以其他方式被告知,有理由,为什么这不起作用 编辑查看一些答案并了解读取 , 写入和可执行内存,我刚才意识到可以通过写入可执行内存在C中动态创建函数。

如何在struct中正确定义一个函数指针,它将struct作为指针?

我有一个带回调函数的结构,回调函数需要一个指向结构的指针才能进行操作。 如何正确定义这些元素,以便在没有警告的情况下进行编译? typedef struct { // some fields required for processing… int (*doAction)(struct pr_PendingResponseItem *pr); } pr_PendingResponseItem; 如果我删除pr参数上的“struct”属性,我会收到错误。 如果我留下它,我会收到一个警告:“它的范围只是这个定义或声明,这可能不是你想要的” 这一切都有效,但我想知道定义这种结构的正确方法。 另外相关的是定义一个自引用结构: typedef struct LinkedItem_ { LinkedItem_ * prev; LinkedItem_ * next; void * data; } LinkedItem; (我认为这是正确的,但如果与问题相关,则欢迎其他想法。)

通过Ctypes从C到Python – 将函数指针的结构包装到静态函数

我有一个像这样的C库中的结构。 DataFn中的函数指针指向静态函数。 。H struct Data { int i; int *array; }; typedef struct { bool (* const fn1) (struct Data*, const char *source); …. } DataFn; extern DataFn const DATAFUNC 使用objdump,该表仅包含DATAFUNC和gcc中的一些其他内容。 这在C中很好,其中调用fn1就像DATAFUNC.fn1(…,…),但是这样的东西怎么会被包裹起来所以fn1可以用python w / ctypes调用? 示例python libc = ctypes.cdll.LoadLibrary(“./data.so”) print(libc.DATAFUNC) 导致 这是类似的,但没有工厂function。