3

我的问题是我在多线程应用程序中看到过这样的代码:

void Thread( void* pParams )
{  
    int *milliseconds = (int *)pParams;
    Sleep(milliseconds);
    printf("Finished after %d milliseconds", milliseconds); //or something like that
}

这极大地引起了我的兴趣,我知道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');

我可能完全错了,即使这确实有效,这是可怕的做法吗?谢谢。

4

5 回答 5

7

是的,void *非常适合创建通用函数。但是,一旦将指向某个数据类型的指针传递给接受 a 的函数,就会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;
    }
}

输出

you passed in int 42
you passed in double 3.140000
you passed in char a
于 2010-12-08T21:22:15.573 回答
7

是的,可以创建一个接受多种类型的函数,但这不是你的做法。

在您的myfunc,sizeof(param)将始终相同:sizeof在编译时确定,并且将是指针的大小。

它适用于线程的原因是,编码器通常在编译时知道指针指向的内容,而您只需要一个简单的强制转换。如果您在编译时不知道void *指向什么,则必须以某种方式在运行时传递它。

关键void *在于:您只能将它们恢复到最初的状态,而这取决于您知道那是什么。一个简单void *的本身不能告诉你它指向什么。

于 2010-12-08T21:22:41.540 回答
0

sizeof(param)将始终返回指针的大小,因此如果您在 64 位系统上,大概是 8。这与它指向的内容无关。

于 2010-12-08T21:20:57.383 回答
0

不起作用,因为sizeof(param)正在尝试获取指针的大小。

于 2010-12-08T21:21:12.793 回答
0

a 的大小void*完全取决于系统并在编译时确定,而不是取决于其中实际包含的内容。

于 2010-12-08T21:21:47.693 回答