Void**一个通用指针?

Ada*_*rsh 20 c c++

void *是一个通用指针,但是呢void **?是void **也一个通用的指针?

我们可以强制转换void **int **,char **等等.

我会感谢堆栈溢出系列的任何信息.

Que*_*tin 19

不是void**指针void*,而不是别的.只是void*像通用指针一样.

请注意,实际尝试它可能会产生一致的结果,但只有标准规定了上述内容,其他任何内容都是未定义的行为,可能会毫不留情地崩溃.


Yak*_*ont 6

void**是一个指针void*.除了它是未定义的行为(虽然可怕,行为通常由您的编译器定义),如果您执行以下操作,这也是一个巨大的问题reinterpret_cast:

int x = 3;
char c = 2;
int* y = &x;
void* c_v = &c; // perfectly safe and well defined
void** z = reinterpret_cast<void**>(&y); // danger danger will robinson

*z = c_v; // note, no cast on this line
*y = 2; // undefined behavior, probably trashes the stack
Run Code Online (Sandbox Code Playgroud)

指针的指针是非常不同的指针.指针上相对安全的类型更改对指针的指针不安全.


hac*_*cks 5

使 ** 通用指针无效?

void **不是通用指针。标准只说即将void *成为一个通用指针。

第 22 章:指向指针的指针

关于指针指针和内存分配的一个观点:尽管由void *返回的类型malloc通用指针,适用于分配给任何类型的指针或从任何类型的指针分配,但假设类型void **不是指向指针通用指针。


我们可以将类型转换void **int **char **等等。

不,你不应该。

C-FAQ说:

C 中没有通用的指针到指针类型void *仅用作通用指针,因为在将其他指针类型分配给和来自void *'时会自动应用转换(如果需要);如果尝试间接void **指向指向除void *. 当您使用的void **指针值(例如,当您使用*运营商访问void *到的值void **点),编译器无法知道是否该方式void *价值一度从其他指针类型转换。它必须假设它只不过是一个void *; 它不能执行任何隐式转换。

换句话说,您使用的任何void **值都必须是void *某处实际值的地址;像 那样的强制转换(void **)&dp,虽然它们可能会关闭编译器,但它们是不可移植的(甚至可能无法执行您想要的操作;另见问题 13.9)。如果指向的指针void **不是 a void *,并且它的大小或表示形式与 a 不同void *,那么编译器将无法正确访问它