访问 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 = &num;
    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* 与这些其他指针变体混合使用是不安全的。