Tag: void pointers

C:如何访问存储在void指针中的函数指针(void *)?

混淆了如何访问存储在void指针中的函数指针(void *)。 假设你有这个: void *functions[] = { &sqrt, // int ft_sqrt(int nb); &power, &logN, &factorial; }; // An array of void pointers, each storing a function pointer. 如果我想访问sqrt函数,我的猜测如下: (int (*)(int)) functions[0](x) 但我的猜测是错误的: error: called object type ‘void *’ is not a function or function pointer 那么如何访问其中一个函数呢?

将函数指针转换为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 […]

双链表和void指针

我用void指针写了这个双链表 typedef struct list_el { void *data; struct list_el *prev; struct list_el *next; } list_el; typedef struct linked_list { int n_el; /*number of elements*/ list_el * head; /*pointer to the head*/ list_el * tail; /*pointer to the head*/ } linked_list; 我写了这些函数来处理它。 /*for list_el allocation*/ list_el * new_el ( void ) { return (list_el *) malloc(sizeof(list_el)); […]

在C中更改void指针值时出现问题

基本上我的问题是我正在尝试更改cambiar_valor变量中的值,以便在调用cambiar_valor函数之后它变为25.但我的问题是它根本没有变化。 我在这里做错了什么? 我正在尝试制作一个非常通用的函数,以便根据我传递给函数的数据类型,它会改变。 在这种情况下是一个整数类型,但我在这里尝试做的是检查我是否可以更改函数内的valor变量的值 #include #include void cambiar_valor(void* valor,int* valor_dos) {//assign valor_dos to valor valor = valor_dos; } int main() { void *valor; int *valor_dos = 25; cambiar_valor(valor,valor_dos); printf(“%d \n”,(int*)valor);//this should show 25 return 0; }

使用(void *)作为通用数据容器时的L值问题

这是程序中使用的结构: struct basic_block { void * aux; /* Many other fields, which are irrelevant. */ }; 现在: 在程序执行期间存在几个basic_block实例。 该程序分阶段/通过,一个接一个地执行。 aux字段用于在阶段执行期间存储stage和basic_block特定数据,并由阶段本身释放(因此下一阶段可以重用它)。 这就是为什么它是一个void * 。 我的舞台使用aux来存储一个struct ,所以每次我想访问某些东西时,我都要做一个强制转换: ( (struct a_long_struct_name *) (bb->aux))->foo_field = foo; 现在,我的问题:每次像这样投下它是一种痛苦,当它是更复杂的表达式的一部分时难以阅读。 我建议的解决方案是:使用宏为我做演员: #define MY_DATA(bb) \ ( (struct a_long_struct_name *) (bb)->aux) 然后我可以访问我的数据: MY_DATA(bb)->foo_field = foo; 但是:我不能将MY_DATA(bb) 本身用作L值(对于malloc ),所以我使用该宏并不是一个好主意: /* WRONG! I cannot assign to […]

从bsearch和lfind确定索引?

我试图在lfind和bsearch返回指向它找到的元素的指针之后获取数组中元素的索引。 到目前为止我有这个: (char *) (found – cv->baseAddress); 找到的是函数找到的地址,基址是元素0的地址。但是,编译器给出了这个错误: cvector.c:150:28:警告:减法中使用的’void *’类型的指针cvector.c:150:4:warning:return从指针生成整数而没有强制转换 我该怎么办?

为什么不需要将参数传递给qsort比较器函数?

以下代码取自此处 。 * qsort example */ #include #include int values[] = { 40, 10, 100, 90, 20, 25 }; int compare (const void * a, const void * b) { return ( *(int*)a – *(int*)b ); } int main () { int n; qsort (values, 6, sizeof(int), compare); for (n=0; n<6; n++) printf ("%d ",values[n]); […]

Cite / C ++中的SQLite。 sqlite3_exec:回调函数中的参数集指向空字符串

我正在尝试一些非常基本的东西 – 使用SQLite的C / C ++接口返回SELECT语句的结果。 我的数据表只有两个字段 – 键(varchar)和值(文本)。 鉴于密钥,我的目标是通过查询SQLite数据库来返回值。 我传递给* sqlite3_exec * – * select_callback *函数以及param (char *)。 param在* select_callback *中成功设置为正确的值。 但是,在调用* sqlite3_exec * param指向空字符串后(尽管指向相同的内存)。 知道出了什么问题以及如何解决这个问题? * sqlite3_exec *在幕后为param释放内存吗? 先感谢您! // given the key tid returns the value void getTypeByID(sqlite3 * db, string tid) { string sql_exp_base = “select value from Data where key=””; […]

传递给void **而不是void *会让编译器抱怨类型,为什么?

我不明白为什么编译器警告我在这段代码中传递一个不兼容的指针类型:(在这个上下文中void *和void **之间的区别是什么)(我不知道这是否有所不同但我是使用gnu99 C版) void someFunc(void ** foo) { printf(“%s\n”, *foo); } int main() { char * text = “some text”; someFunc(&text); return 0; } 而在这不是 void someFunc(void * foo) { printf(“%s\n”, foo); } int main() { char * text = “some text”; someFunc(text); return 0; } 提前致谢

在Python SWIG中包装void *参数

我用Python SWIG包装这个lib,它有一个如下所示的函数: int set_option(Foo *foo, const char *name, void *value); 在lib const char *name中映射到我有权查询的类型: int , char * , char ** 。 默认生成的包装器代码只接受包装的void * (自然)。 使包装方法接受任何 Python对象作为参数的最佳方法是什么,并在我自己的C代码中进行类型检查和Python到C转换? 我的猜测是某种类型的地图,但唉,我无法弄清楚。 @Goodies In [12]: lib.set_option(foo, “option”, “value”) ————————————————————————— TypeError Traceback (most recent call last) in () —-> 1 lib.set_option(foo, “option”, “value”) TypeError: in method ‘set_option’, argument 3 of […]