gpt4 book ai didi

c - 返回一个空指针作为线程返回

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:35:00 26 4
gpt4 key购买 nike

这是来自 apue 的一个精简示例

#include <pthread.h>
#include <errno.h>
#include <unistd.h>
#include <stdio.h>

void err_exit(const char* text){
char buf[200];
sprintf(buf, text);
perror(buf);
abort();
}

void * thr_fn1(void *arg)
{
printf("thread 1 returning \n");
return ((void *)1);
//This is returning the pointer to 1.
//Is this address somewhat special?
}

int main(int argc, char *argv[])
{
int err;
pthread_t tid1;
void *tret;

err = pthread_create(&tid1, NULL, thr_fn1, NULL);
if (err != 0) {
err_exit("can't create thread 1");
}

err = pthread_join(tid1, &tret);
if (err != 0) {
err_exit("can't join with thread 1");
}

printf("Return of thread 1 %ld\n", (long)tret);
return 0;
}

在这个例子中有两件事我不清楚。

我将 return ((void *)1); 解释为 返回一个指向地址 1 的空指针。为什么这样可以?选择这样的任意内存位置并将其视为退出状态?

printf("Return of thread 1 %ld\n", (long)tret); 返回的((void *)1),现在是 tret 被强制转换为 long,通过它我们将其从 char 扩展为 long。为什么此源代码中提供了足够的信息以便我们可以安全地使用“从地址 1 开始的长内存”

最佳答案

将整数转换为 void 指针是实现定义的:

6.3.2.3 Pointers

  1. An integer may be converted to any pointer type. Except as previously specified, the result is implementation-defined, might not be correctly aligned, might not point to an entity of the referenced type, and might be a trap representation.

(在陷阱表示的情况下,行为未定义。)

再次将指针转换为整数也是实现定义的。 1 在转换为 void* 之前的类型实际上是 int 而不是 char,但这并不重要不再是因为对象的类型是 void* 并且它正在被转换为 long

  1. Any pointer type may be converted to an integer type. Except as previously specified, the result is implementation-defined. If the result cannot be represented in the integer type, the behavior is undefined. The result need not be in the range of values of any integer type.

正确的返回方式是返回一个指向对象的指针,该对象具有静态或分配的存储持续时间。由于您要返回错误代码,我们可以假设它们的数量有限,因此 const 静态对象可以工作:

void* thr_fn1(void* arg)
{
printf("thread 1 returning \n");
static const long ok_return = 1;
return (void*)&ok_return;
}

打印对象是不同的,因为我们有一个指向长对象的有效指针:

printf("Return of thread 1 %ld\n", *(const long*)tret);

关于c - 返回一个空指针作为线程返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36568672/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com