gpt4 book ai didi

关于无效的澄清*

转载 作者:太空宇宙 更新时间:2023-11-04 03:33:50 25 4
gpt4 key购买 nike

因为我们只能将一个指针转换为另一个指针,那么“(void *) t 和 (int)threadid”在下面的代码中究竟是如何工作的呢?我们不应该使用 &t 而不是 t 吗?

void *PrintHello(void *threadid)
{
long tid;
tid = (long)threadid;
printf("Hello World! It's me, thread #%ld!\n", tid);
pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc;
long t;
for(t=0;t<NUM_THREADS;t++){
printf("In main: creating thread %ld\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}

/* Last thing that main() should do */
pthread_exit(NULL);
}

最佳答案

为了扩展我的评论,C 明确规定指针可以转换为整数,反之亦然。除了值为 0 的整数常量(可靠地转换为 NULL 指针)外,结果是实现定义的。这种转换只需要按照我下面的附录中的描述是可逆的。

然而,在实践中,对于某些 n,指针表示通常采用等同于 n 位无符号整数的形式。在这些情况下,通常情况下您可以安全地在指针和足够宽度的整数之间来回转换而不会丢失信息。更有可能(但仍然不能保证)您可以从(不太宽的)整数到指针并返回而不会丢失信息,即使您可能无法安全地执行指针 -> 整数 -> 指针。符合标准的 C 实现将记录所有实现定义的行为的详细信息,包括这些。

您提供的程序取决于此类转换;它们可以在许多环境中工作,但它们是否真的可以工作取决于所使用的 C 实现。正如您所建议的那样,通过传递一个真正的指针(并将其作为一个指针使用)可以避免这种实现依赖。

更新添加:

在评论中,@IanAbbott 提出了 intptr_t 类型,C2011 是这样描述的:

a signed integer type with the property that any valid pointer to void can be converted to this type, then converted back to pointer to void, and the result will compare equal to the original pointer [...] optional.

-- C2011, 7.20.1.4

提供此类型的符合规范的实现将确保其关于转换的行为符合规定,但由于实现提供它是可选的,因此这不会与指针/整数转换的实现指定性质冲突(这在 C2011 6.3.2.3/3-6 中有描述)。即使是提供这种类型的实现也不因此接受涉及其他整数类型(或其他指针类型)的转换的任何义务。

另请注意,尽管 intptr_tuintptr_t(如果可用)提供了从指针到整数返回到指针的往返转换,但其规定与整数无关就标准而言,指向整数的指针。

关于关于无效的澄清*,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34092669/

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