[英]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 = #
routine((void*)num_p);
}
在傳遞之前指向num
的地址就可以了。 將 integer 轉換為 void 指針是沒有意義的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.