簡體   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