传递 C++ void 指针

Passing C++ void pointers

我对 void 指针感到困惑。尽管此代码片段可以编译,但取消引用函数 f2 中的变量 c 是否未定义行为?

#include <cstdlib>
#include <cstdio>

void f2(void* c) {  // legal/stupid
    // although this compiles, is dereferencing c here undefined behaviour?
}

void f1(void** b) {
    printf("%d\n", *(int*)*b);
    f2(b);
}

int main() {    
    int i{ 5 };
    void* a{ (void*)&i };
    f1(&a);
    return 0;
}

void* 转换回原始类型的指针 不是 未定义的行为:

int a = 10;

void* b = (void*)&a;

int* c = (int*)b;

int d = *c; //d == 10 now; this is fine

因此,如果在使用它之前 f2c 转换回 void**,代码将是明确定义的。如果 f2 尝试将 c 转换为其他内容(例如,如果 f2 将 c 转换为 int*,即使它被赋予了 void**),那 是未定义的行为。

几乎唯一的例外是强制转换为 char*:保证没问题。

也就是说,因为在使用 void* 指针时没有类型安全性,所以如果可能的话,您应该使用其他东西。

这意味着:

void f2(void* c) {
    void** b = (void**)c;         // Get original void**
    void* b_value = *b;           // Dereference to get void*
    int* int_ptr = (int*)b_value; // Get int* pointer

    int value = *int_ptr;         // Use it
}

是安全的,当且仅当 c 表示指向 void* 的指针,而 void* 本身就是 int*

您的代码导致未定义的行为。

以下片段摘自C11第 6.2.5 章:

The void type comprises an empty set of values; it is an incomplete object type that cannot be completed.

这意味着指向 void 的指针是无效的取消引用操作数。