Tag: 函数指针

C函数指针类型兼容性

编写一个与函数回调一起工作的库,我经常对具有相同调用约定和相同签名的类型进行类型化(和调用)函数指针,但有一个例外:它们具有指向不同类型(所有数据)的参数,或无效指针。 最近,我发现它可能不那么安全,根据这个: https : //stackoverflow.com/a/14044244/3079266 基本上,正如我所理解的那样,如果参数的类型是兼容的,那意味着函数指针类型也是兼容的,并且应该没有问题。 现在,我有3个问题。 第一:这是否意味着,由于指向不同类型的指针在技术上是不兼容的,我所做的可能导致未定义的行为? 第二:在哪里(在什么样的架构上)我可以逃脱它? 其中是Windows x86还是x64版本? 第三:我哪里可以逃脱它?

仅在使用vararg省略号时,函数指针“从不兼容的指针类型分配”

我知道声明一个没有参数列表的函数(或函数指针)(并且在参数列表中没有指定void ),这意味着函数(或函数指针)具有未知数量的参数。 我写了一些测试脚本来检查这种行为: int my_func_1() { return(0); } int my_func_2(int x) { return(x); } int my_func_3(char x, …) { va_list va; va_start(va, x); return(va_arg(va, int)); } int (*fp)(); fp = my_func_1; printf(“%d\n”, fp()); fp = my_func_2; printf(“%d\n”, fp(33)); fp = my_func_3; printf(“%d\n”, fp(33, 44)); 我在linux下的64位机器上编译了这样的: gcc test.c -Wextra -pedantic -std=c1x -O3 -o test 输出是正确的: 0 […]

将图像数据从Java传递到C本机函数接受指针

我在外部.so文件中提供了一个C函数。 此function将图像数据作为输入,并提供压缩图像以及图像的长度作为输出。 function模板如下: char * OutputImage = CompressImage((char *)InputImage,(int)&lenOutImage); 在我的Java代码中,我将输入图像捕获为byte []数据类型。 现在我需要将它传递给上面提到的本机C函数。 能帮助我如何从Java实现这一目标吗?

为什么用括号括起函数?

我展示了一些我明白的代码。 以下代码是示例代码。 static void (_func)(int p); int main() { …. _func(3); …. } static void (_func)(int p) { …. } 一般我知道用括号括起来的函数用’*’作为函数指针(* _func),但是上面代码为什么在函数声明时用括号括起函数? 有什么理由使用这种方法吗?

算法设计手册,第3章,链表代码片段混淆

我正在阅读算法设计手册,在第3章中,出现以下代码片段。 它与从链表中删除项目有关。 问题与数据结构无关,而是与我认为声明了两个变量的单行代码有关。 为简洁起见,我删除了代码中不相关的部分。 list *search_list(list *l, item_type x) { // This function just searches the list x } list *predecessor_list(list *l, item_type x) { // This function simply returns the predecessor of x or NULL } delete_list(list **l, item_type x) { list *p; /* item pointer */ list *pred; /* predecessor pointer */ list […]

如何声明一个返回函数指针的函数?

想象一个带有参数double和int的函数myFunctionA: myFunctionA (double, int); 这个函数应该返回一个函数指针: char (*myPointer)(); 如何在C中声明此function?

将代理传递给D中的外部C函数

如何在D中将代理传递给带有函数指针的外部C函数?

使用不同指针类型作为参数来转换函数指针

我认为以下代码描述了我想要做的事情。 具体来说,我希望将一个函数指针强制转换为generics函数类型,唯一的区别在于签名是不同的指针类型。 现在,我知道要求函数指针兼容,如本问题所述 ,但我不确定是否有不同指针类型的参数满足兼容性要求。 代码编译并运行,但是,正如预期的那样,从不兼容的指针类型给出有关赋值的警告。 有没有办法满足编译器并实现我的目标? #include int float_function(float *array, int length) { int i; for(i=0; i<length; i++){ printf("%f\n", array[i]); } } int double_function(double *array, int length) { int i; for(i=0; i<length; i++){ printf("%f\n", array[i]); } } int main() { float a[5] = {0.0, 1.0, 2.0, 3.0, 4.0}; double b[5] = {0.0, 1.0, 2.0, 3.0, […]

在C中初始化函数指针

我有这个function uint8_t Authorization_getRole (char const* userId, UsertoRole_T const *roleTable) 在主程序中我有: given_Role = Authorization_getRole (userId, roleTable) 我想用函数指针替换函数调用: uint8_t (*getRole_ptr)() given_Role = &getRole_ptr; 我的问题是: 我在哪里初始化函数指针getRole_ptr? 如何初始化函数指针? 下面的语法是否正确? getRole_ptr = Authorization_getRole (userId, roleTable)

如何调用指向typedef结构中定义的函数的指针

以下代码有什么问题? 下面的parseCounter1()和parseCounter1()是两个函数。 我把他们的指针放在const OptionValueStruct中 当option_values []的每个元素都可以相应调用它们 经历了: typedef struct OptionValueStruct{ char counter_name[OPTION_LINE_SIZE]; int* counter_func; } OptionValueStruct_t; const OptionValueStruct option_values[] = { {“Counter1”, (*parseCounter1)(char*, char**)}, {“Counter2”, (*parseCounter2)(char*, char**)}, }; const OptionValueStruct *option = NULL; for(int i = 0; icounter_func(opt_name, opt_val); }