我正在嘗試使用智能指標,并撰寫了以下代碼:
struct Buffer
{
char Data[128];
};
class SmartPtr {
char * dataPtr;
public:
SmartPtr(Buffer& b)
{
dataPtr = b.Data;
}
~SmartPtr()
{
cout << "desctructor called" << endl;
}
void operator=(Buffer & b)
{
dataPtr = b.Data;
}
char*& operator*()
{
return dataPtr;
}
};
我認為,當使用與類的第一個成員的型別相同型別的指標時,我可以訪問該成員。
我想要做的是dataPtr通過獲取物件的地址來訪問p。
我期待p并dataPtr擁有相同的地址。
以下代碼列印垃圾。
static Buffer buff;
int main(void)
{
strcpy(buff.Data, "Hello world");
SmartPtr p = buff;
char* s = (char*)&p;
cout << "Data: " << s << endl;
return 0;
}
輸出:
Data: ??┴─≈
desctructor called
如果我將其更改為雙指標,我會得到預期的結果
static Buffer buff;
int main(void)
{
strcpy(buff.Data, "Hello world");
SmartPtr p = buff;
char** s = (char**)&p;
cout << "Data: " << *s << endl;
return 0;
}
輸出:
Data: Hello world
desctructor called
是因為使用單個指標我取消參考實際指標的地址作為變數而不是它包含的地址嗎?
uj5u.com熱心網友回復:
在第一個代碼中,您獲取 的地址p(以及 的地址p.dataPtr),將其轉換為char*,然后按原樣列印。因此,將其自身operator<<的原始記憶體誤解p為好像它是一個以空字符結尾的字串,但事實并非如此,因此您會得到垃圾。
在第二個代碼中,您將獲取 的地址p(以及 的地址p.dataPtr),將其轉換為char**,取消參考以將其值作為 a 訪問char*,然后列印該值。因此,將指向operator<<的資料列印p.dataPtr為一個以空字符結尾的字串,它就是這樣,所以你得到了正確的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506513.html
上一篇:如何在C中讀取記憶體區域
下一篇:帶有指標的c 程式中的奇怪問題
