Ken*_* R. 3 c function void-pointers
我的问题是我在多线程应用程序中看到了这样的代码:
void Thread( void* pParams )
{
int *milliseconds = (int *)pParams;
Sleep(milliseconds);
printf("Finished after %d milliseconds", milliseconds); //or something like that
}
Run Code Online (Sandbox Code Playgroud)
这大大引起了我的兴趣,我知道malloc发回一个void指针,你可以把它转换成你想要的,这是否意味着我可以创建一个可以接受任何数据类型的函数?
例如我在没有测试的情况下编写的函数:
void myfunc( void* param )
{
switch(sizeof(param)) {
case 1:
char *foo = (char *)param; break;
case 2:
short *foo = (short *)param; break;
case 4:
int *foo = (int *)param; break;
}
}
myfunc(3.1415);
myfunc(0);
myfunc('a');
Run Code Online (Sandbox Code Playgroud)
我可能完全错了,即使这确实有效也是可怕的做法?谢谢.
是的,void *非常适合创建通用功能.但是,一旦将指向某个数据类型的指针传递给一个使void *您丢失所有类型信息的函数.一种控制程序的方法,因此它知道你传入的类型是第二个类型参数,enum它可能有INT,FLOAT,DOUBLE等值.
#include <stdio.h>
typedef enum inputTypes
{
INT,
DOUBLE,
CHAR
} inType;
void myfunc(void*, inType);
int main(void)
{
int i = 42;
double d = 3.14;
char c = 'a';
myfunc(&i, INT);
myfunc(&d, DOUBLE);
myfunc(&c, CHAR);
return 0;
}
void myfunc(void* param, inType type)
{
switch(type) {
case INT:
printf("you passed in int %d\n", *((int *)param));
break;
case DOUBLE:
printf("you passed in double %lf\n", *((double *)param));
break;
case CHAR:
printf("you passed in char %c\n", *((char *)param));
break;
}
}
Run Code Online (Sandbox Code Playgroud)
you passed in int 42
you passed in double 3.140000
you passed in char a
Run Code Online (Sandbox Code Playgroud)
是的,可以创建一个接受多种类型的函数,但这不是你怎么做的.
在你的myfunc,sizeof(param)将永远是相同的:sizeof在编译时确定,并将是指针的大小.
它适用于线程的原因,通常它是编码器在编译时指向指向的内容,并且您需要的只是一个简单的强制转换.如果您在编译时不知道要void *指向的是什么,则必须以某种方式在运行时传递它.
关键void *在于:您只能将它们放回到最初的任何位置,您可以自己知道它是什么.简单void *本身并不能告诉你它指向的是什么.