C中的数据类型转换

时间:2016-08-01 06:32:08

标签: c pointers

#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 *)类型,而不是intlong。所以,它应该像这样改变:

(long) *res

但是,如何将其更改为(long) res

3 个答案:

答案 0 :(得分:0)

此处strlen返回一个整数,该整数被强制转换为void *指针,然后返回printf调用中的整数。

关于指针和整数之间的转换,C99标准只保证void *指针可以转换为uintptr_tintptr_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等类似的东西。