#include <pthread.h>
#include "../header/tlpi_hdr.h"
static void *
threadFunc(void *arg)
{
char *s = (char *) arg;
printf("%s", s);
return (void *) strlen(s);
}
int
main(int argc, char *argv[])
{
pthread_t t1;
void *res;
int s;
s = pthread_create(&t1, NULL, threadFunc, "Hello world\n");
if (s != 0)
errExitEN(s, "pthread_create");
printf("Message from main()\n");
s = pthread_join(t1, &res);
if (s != 0)
errExitEN(s, "pthread_join");
printf("Thread returned %ld\n", (long) res);
exit(EXIT_SUCCESS);
}
上面的代码正是我现在正在研究的内容,但我无法理解数据类型的转换。
在threadFunc()
上,返回类型为void *
。但是,通过此功能,strlen(s)
是size_t
类型。但是如何将其更改为(void *)
。我的意思是,为什么不(void *) &strlen(s)
?
而且,在main()
中,还有printf("Thread returned %ld\n", (long) res);
。
由此,变量res
是(void *)
类型,而不是int
或long
。所以,它应该像这样改变:
(long) *res
。
但是,如何将其更改为(long) res
?
答案 0 :(得分:0)
此处strlen
返回一个整数,该整数被强制转换为void *
指针,然后返回printf
调用中的整数。
关于指针和整数之间的转换,C99标准只保证void *
指针可以转换为uintptr_t
或intptr_t
整数,然后返回void *
指针和结果如果定义了这些可选类型(Reference),则将与原始指针进行比较。
这里完成的转换是不同的,并且不能保证工作,但由于几乎所有现代计算机内部都将指针表示为整数,因此只要整数与void *
指针的大小相同,它通常就会起作用。
因此,如果您知道编译器如何处理这种转换,那么您可以执行类似的操作,但通常不应该这样做。
返回整数值的正确方法是为整数值分配空间,然后返回指向它的指针。
答案 1 :(得分:0)
但是如何将其更改为
(void *)
。我的意思是,为什么不(void *) &strlen(s)
(?)
strlen()
的返回类型是size_t
,是一些无符号整数类型。将任意整数值转换为void*
是未定义的行为(UB)。
return (void *) strlen(s); // Undefined behavior
代码可以保存长度某处,比如在静态/全局或分配的内存中并返回地址。我怀疑这会符合OP的其他编码目标。
static size_t len = 0;
len = strlen(s);
return (void *) &len;
来自strlen()
1)的返回值不能使用&strlen(...)
获取其地址2)即使语言允许,代码仍需要考虑指针的生命周期。
如何将其更改为(long)res?
调用代码将返回的指针解释为相同类型以防止UB非常重要。
void *res;
...
s = pthread_join(t1, &res);
if (s != 0) {
errExitEN(s, "pthread_join");
}
if (res != NULL)
size_t *len_ptr = (size_t*) res;
printf("Thread returned %zu\n", *len_ptr);
// or if long is truly needed
long len_as_long = (long) *len_ptr;
printf("Thread returned %ld\n", len_as_long);
}
答案 2 :(得分:-1)
你不能返回(void *)&amp; strlen(s),因为你会收到错误。你想做的是var = strlen(s); return(void *)&amp; var;。但事实上这是不正确的,因为你返回一个指向一个变量的指针,该变量将在函数的末尾被销毁,所以你的指针将指向一个空的或覆盖的内存部分。 pthread函数正在做什么有点奇怪,因为你得到了位置12的值。除了检查pthread是否正在运行之外,这是一个无意义的事情。 并且strlen返回size_t,根据What is size_t in C?
,可以是int或short等类似的东西。