C代码中的“(void*)2”是什么意思?

x33g5p2x  于 2022-10-17  发布在  Unix
关注(0)|答案(1)|浏览(376)

我最近读了一本关于如何在Unix环境下编写代码的书。其中有一个示例代码,让我非常困惑。
示例代码如下:


# include "apue.h"

# include <pthread.h>

void *
thr_fn1(void *arg) {
  printf("thread 1 returning\n");
  return ((void *)1);
}

void *
thr_fn2(void *arg) {
  printf("thread 2 exiting\n");
  pthread_exit((void *)2);
}

int 
main(void) {
  int err;
  pthread_t tid1, tid2;
  void *tret;

  err = pthread_create(&tid1, NULL, thr_fn1, NULL);
  if (err != 0) {
    err_exit(err, "can't create thread 1");
  }
  err = pthread_create(&tid2, NULL, thr_fn2, NULL);
  if (err != 0) {
    err_exit(err, "can't create thread 2");
  }
  err = pthread_join(tid1, &tret);
  if (err != 0) {
    err_exit(err, "can't join with thread 1");
  }
  printf("thread 1 exit code %ld\n", (long)tret);
  err = pthread_join(tid2, &tret);
  if (err != 0) {
    err_exit(err, "can't join with thread 2");
  }
  printf("thread 2 exit code %ld\n", (long)tret);
  exit(0);
}

如何算出“(空*)1”或“(空*)2”?是否可以将“void*”类型转换为“long”类型?在我看来,“(void*)1”告诉我1是一个地址,但当我使用deref获取存储在地址1处的值时,它显然是错误的。所以,我认为这个代码太疯狂了。

hfsqlsce

hfsqlsce1#

C代码中的“(void*)2”是什么意思?
这意味着将值Two转换为“指向void的指针”类型。
pthread_exit((void *)2);
通常,线程应返回指向数据的指针(使用普通函数返回机制或将其作为参数传递给pthread_exit)。在这种情况下,数据非常小,作者认为不值得只为数据分配内存;他们将简单地使用指针本身来表示数据。因此,它们将所需的值转换为void *类型。
这种行为并没有完全由C标准定义,但它可以在许多C实现中工作,特别是在Unix系统上。调用方应将void *转换回整数类型以解释该值。

相关问题