C 如何更改线程函数内部的void*参数

C 如何更改线程函数内部的void*参数,c,multithreading,void-pointers,C,Multithreading,Void Pointers,我正在为来自客户端的每个请求创建一个线程,以获取服务器上的文件。线程函数通常获取一个空指针;但我需要给它一个char指针作为参数,并希望线程函数用文件名填充它 代码创建一个线程: pt_ret = pthread_create(&thread_id, NULL, getfiles, (void*) thread_buff); pthread_join(thread_id, pt_ret); Def。线程函数的定义: void *getfiles(void *ptr) { /*

我正在为来自客户端的每个请求创建一个线程,以获取服务器上的文件。线程函数通常获取一个空指针;但我需要给它一个char指针作为参数,并希望线程函数用文件名填充它

代码创建一个线程:

pt_ret = pthread_create(&thread_id, NULL, getfiles, (void*) thread_buff);
pthread_join(thread_id, pt_ret);
Def。线程函数的定义:

void *getfiles(void *ptr) {
    /* ... */
    char buff[256]; // populating that local buffer with the file names
    // ptr should be as a return of buff
}

我尝试了不同的方法,但每次线程完成后,线程buff都会变成“Q”。

只要将其转换为char*,因为您知道它实际上是char*:

或者您也可以只处理ptr指向的缓冲区,而不复制它,这样在线程结束后就可以访问它:

void *getfiles(void *ptr) {
    /* ... */
    char *buff = (char*)ptr;
    /* do stuff with buff. */
}

我认为问题在于,您希望在线程结束后使用存储在线程的“buff”var中的数据。这是不可能的,数据只暂时存在于堆栈上

您必须传递一个char**ptr,并用buff的副本填充它,如:

*ptr = strdup(buff)

并将(void*)和thread\u buff而不是(void*)thread\u buff传递给thread函数。

不需要在C中对
void*
进行任何强制转换。您可以发布更多代码吗?编辑后,检查第二个解决方案。不需要强制转换,并且会混淆。简单地分配它。为什么他需要传递一个指向char的指针?在线程结束后,如果他使用了char*,那么缓冲区仍然可用,因此thread_buff指向线程的buff变量的副本。但是我必须承认op的评论“ptr应该作为buff的返回”令人困惑。
*ptr = strdup(buff)