Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将基元数据类型转换为无效指针类型_C++_C_Pointers_Pthreads - Fatal编程技术网

C++ 将基元数据类型转换为无效指针类型

C++ 将基元数据类型转换为无效指针类型,c++,c,pointers,pthreads,C++,C,Pointers,Pthreads,我在读关于pthreads的书。在一个例子中,他们给出了源代码 在创建线程时,它们将一个长类型(铸造为void*type)传递给函数 在函数内部,它们接收该值并反向转换以获得长值 Q1:是否允许将指针类型转换为原始数据类型,反之亦然(在C和C++中) 问题2。如果是这样,这样做是件好事吗?他们不应该创建一个指向这个长类型的指针,然后将这个指针转换为void*并传递给函数吗 我发现将原语类型转换为指针类型的想法非常混乱? 从任意指针类型到void*的转换是可以理解的,但是为什么原始数据类型存储在v

我在读关于pthreads的书。在一个例子中,他们给出了源代码

在创建线程时,它们将一个长类型(铸造为void*type)传递给函数

在函数内部,它们接收该值并反向转换以获得长值

Q1:是否允许将指针类型转换为原始数据类型,反之亦然(在C和C++中)

问题2。如果是这样,这样做是件好事吗?他们不应该创建一个指向这个长类型的指针,然后将这个指针转换为void*并传递给函数吗

我发现将原语类型转换为指针类型的想法非常混乱?
从任意指针类型到void*的转换是可以理解的,但是为什么原始数据类型存储在void*类型中呢?在一个特定的系统上,原语类型的大小是否有可能比指针类型的大小更大?

Q1:是的,但这是由实现定义的(=取决于平台)是否有效。更安全的版本将使用
uintptr\t
而不是
long


问题2:这绝对是一种糟糕的风格。通过分配
long
并传递地址,这样做不会对性能造成太大的损失。

是否可以通过动态转换将指针转换为原始数据类型?那么,这是否意味着最好不要遵循本教程和我现在发现的许多其他教程?是否可以编写如下内容:rc=pthread_create(&threads[t]、NULL、PrintHello、(void*)&t)@H-Bahrami dynamic_cast只能应用于引用和指针。在某些平台上,它是将数据传递给线程(例如windows和_beginthread)的唯一方法,因此说它是“坏样式”可能有点过分OTT@AndersK,这里是pthreads,接口需要一个
void*
,它应该始终可以传递指向数据的指针。在支持pthreads的系统上,它需要工作(符合POSIX)。在一般系统上,它可能不起作用。你混淆了两件事,指针和指针对象,
void*
是一个指针,就像
long*
(是
&longValue
的结果),它们在大多数系统上应该有相同的大小。好吧,指针对象可以是任意大小;地址(指针)通常大小相同(请在系统上尝试
sizeof(void*)
sizeof(long*)
)。调用此函数时,将指向数据转换的指针传递给
void*
,而不是数据本身转换为
void*