C语言中的铸造问题

C语言中的铸造问题,c,multithreading,casting,pthreads,C,Multithreading,Casting,Pthreads,我得到了这个错误:赋值从整数生成指针而不进行强制转换。我正在使用线程 这就是我正在做的: void *calculate(void *arg) { unsigned long *array; ..... return array; } int main() { unsigned long *result; void *ptr; ... p_thread_create(...); p_thread_join(td, &ptr); ... result = *((unsigned long

我得到了这个错误:赋值从整数生成指针而不进行强制转换。我正在使用线程

这就是我正在做的:

void *calculate(void *arg) {
unsigned long *array;
.....
return array;
}

int main() {
unsigned long *result;
void *ptr;
...
p_thread_create(...);
p_thread_join(td, &ptr);
...
result = *((unsigned long *) ptr); /* This is the line where my error occurs */

return 0;
}
calculate函数返回无符号长类型的数组。线程的返回值存储在一个void指针中,因为它是void,所以我将它转换为*unsigned long

但它不起作用


有什么想法吗?

应该是这样的:

result = (unsigned long *) ptr;

如果要从thread函数返回单个数字(指向
ptr
点),请使用

unsigned long result = *((unsigned long *) ptr);
如果要返回指向
无符号long
数组的指针,请使用

unsigned long *result = ptr;

找出结果的类型。找出要分配给它的表达式的类型。请注意,它们不同。请尝试更改此选项:
result=*((unsigned long*)ptr)到此:
结果=((无符号长*)ptr)。第一个是将
ptr
强制转换为
unsinged long
,因为
*
操作符取消了指针的引用。不,它应该是
result=ptr(假设他真的想要指针,而不是指向的值)。你错了。我现在回应是因为我编译它来确定我的想法:你的指令是隐式的,而我的指令是显式的。结果完全一样,我没有错。没有所谓的隐式转换,而是隐式转换。根据定义,强制转换是显式的。它应该是
result=ptr因为它更具可读性——包括显式转换没有任何好处,它只会让代码变得丑陋。不管怎样,结果都是一样的。就我个人而言,当我用Java和C编程时,我更喜欢在分配两种不同类型的地方看到强制转换。在这两种情况下都没有警告。你的推理没有意义-Java不是C。显式转换在C中是不好的做法。再次阅读这个问题,我认为这是错误的,因为你的线程函数计算并返回一个数组,而不是一个数。将很快删除答案。为什么不使用其他可能性(即
result=ptr;
)来更新此答案?这将使这个答案成为最完整的答案。