传递 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
因此,如果在使用它之前 f2
将 c
转换回 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 的指针是无效的取消引用操作数。
我对 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
因此,如果在使用它之前 f2
将 c
转换回 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 的指针是无效的取消引用操作数。