繁体   English   中英

访问由 void 指针引用的 memory

[英]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 指针传递,并在 function 中取消引用它的值。 void 指针的算术是非法的,因此我尝试将指针转换为int*并尝试取消引用这个转换后的副本。

我有点期望这不起作用,但如果是这种情况,我也会期望某种编译器错误,就像在没有int*强制转换的情况下进行此尝试一样。 我有点期望它起作用的原因是强制转换的指针保留了原始的 void 指针地址,这意味着在强制转换之后它似乎只是一个常规的 memory 地址,我认为没有理由通过常规取消引用无法访问该地址。 n变量是引用值的副本,但仅此而已 - 我无法更改 memory 地址中的实际值。

这可以使用 void 指针吗? 我错过了什么?

通常的&num可以了。

routine(&num);

任何 object 指针都会隐式转换为void* 在回调 function 上,您必须将其转换回正确的指针类型(使用static_cast而不是 C 风格的强制转换,这将防止您意外地将包含地址的指针与 integer 值而不是 ZCD69B4957F06BDE81917 地址混淆)

void* routine( void* user_ptr )
{
    int* np = static_cast<int*>(user_ptr);

其他不是 object 指针的指针不会隐式转换为void* ,包括 function 指针和指向成员的指针。 添加强制转换将迫使编译器做错事并对此保持沉默,但是(除了dlsym()或其 Windows 等效的GetProcAddress()的返回值之外)将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;
    int* num_p = &num;
    routine((void*)num_p);
}

在传递之前指向num的地址就可以了。 将 integer 转换为 void 指针是没有意义的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM