访问 void 指针引用的内存
Acessing memory referenced by void pointer
我正在研究 C++ 中的 void 指针,并作为练习编写了以下代码:
void* routine(void* number){
int n = (int)number;
int* np = (int*)number;
cout<<"void pointer: "<<number<<endl;
cout<<"casted int pointer: "<<np<<endl;
cout<<"int pointer content: "<<*np<<endl;
return (void*)NULL;
}
int main(){
int num = 1;
routine((void*)num);
}
这在运行时中断,因为从 void*
到 int*
的指针 np
被取消引用。
我尝试将参数 number
作为 void 指针传递,并在函数内部取消引用它的值。空指针的算术是非法的,因此我尝试做的是将指针转换为 int*
并尝试取消引用此转换的副本。
我有点希望这不会起作用,但如果是这种情况,我也希望出现某种编译器错误,就像在没有 int*
强制转换的情况下进行此尝试时的情况一样。我希望它能工作的原因是转换后的指针保留了原始的 void 指针地址,这意味着在转换之后它看起来只是一个常规内存地址,我认为没有理由无法通过常规取消引用访问它。 n
变量是引用值的副本,但仅此而已 - 我无法更改内存地址中的实际值。
空指针是否可行?我错过了什么?
void* routine(void* number){
int n = (int)number;
int* np = (int*)number;
cout<<"void pointer: "<<number<<endl;
cout<<"casted int pointer: "<<np<<endl;
cout<<"int pointer content: "<<*np<<endl;
return (void*)NULL;
}
int main(){
int num = 1;
int* num_p = #
routine((void*)num_p);
}
在通过之前指向num
的地址就可以了。将整数转换为
空指针毫无意义。
通常&num
会做。
routine(&num);
任何对象指针隐式转换为 void*
。在回调函数中,您必须将其转换回正确的指针类型(使用 static_cast
而不是 C 风格的转换,这将防止您不小心将包含地址的指针与不是内存地址的整数值混淆) .
void* routine( void* user_ptr )
{
int* np = static_cast<int*>(user_ptr);
其他不是对象指针的指针不会隐式转换为void*
,包括函数指针和指向成员的指针。添加强制转换将迫使编译器做错误的事情并且对此保持沉默,但是(除了 dlsym()
的 return 值或其 Windows 等效值 GetProcAddress()
之外)它无论如何,将 void*
与这些其他指针变体混合使用是不安全的。
我正在研究 C++ 中的 void 指针,并作为练习编写了以下代码:
void* routine(void* number){
int n = (int)number;
int* np = (int*)number;
cout<<"void pointer: "<<number<<endl;
cout<<"casted int pointer: "<<np<<endl;
cout<<"int pointer content: "<<*np<<endl;
return (void*)NULL;
}
int main(){
int num = 1;
routine((void*)num);
}
这在运行时中断,因为从 void*
到 int*
的指针 np
被取消引用。
我尝试将参数 number
作为 void 指针传递,并在函数内部取消引用它的值。空指针的算术是非法的,因此我尝试做的是将指针转换为 int*
并尝试取消引用此转换的副本。
我有点希望这不会起作用,但如果是这种情况,我也希望出现某种编译器错误,就像在没有 int*
强制转换的情况下进行此尝试时的情况一样。我希望它能工作的原因是转换后的指针保留了原始的 void 指针地址,这意味着在转换之后它看起来只是一个常规内存地址,我认为没有理由无法通过常规取消引用访问它。 n
变量是引用值的副本,但仅此而已 - 我无法更改内存地址中的实际值。
空指针是否可行?我错过了什么?
void* routine(void* number){
int n = (int)number;
int* np = (int*)number;
cout<<"void pointer: "<<number<<endl;
cout<<"casted int pointer: "<<np<<endl;
cout<<"int pointer content: "<<*np<<endl;
return (void*)NULL;
}
int main(){
int num = 1;
int* num_p = #
routine((void*)num_p);
}
在通过之前指向num
的地址就可以了。将整数转换为
空指针毫无意义。
通常&num
会做。
routine(&num);
任何对象指针隐式转换为 void*
。在回调函数中,您必须将其转换回正确的指针类型(使用 static_cast
而不是 C 风格的转换,这将防止您不小心将包含地址的指针与不是内存地址的整数值混淆) .
void* routine( void* user_ptr )
{
int* np = static_cast<int*>(user_ptr);
其他不是对象指针的指针不会隐式转换为void*
,包括函数指针和指向成员的指针。添加强制转换将迫使编译器做错误的事情并且对此保持沉默,但是(除了 dlsym()
的 return 值或其 Windows 等效值 GetProcAddress()
之外)它无论如何,将 void*
与这些其他指针变体混合使用是不安全的。