2012-10-30 31 views
0

我有一個無效**等生成例如如何圍繞雙指針傳遞參數,以便值保持

int x = 10; 
void* p = &x; 
void** p2 = &p; 

這是在函數創建P2變量。我如何使用參數或返回值以p2和* p2都保持其精確值的方式傳遞此p2。我沒有找到任何解決方案。請給我一個簡短的例子,任何事情都可以做。

也許一些細節可以幫助:

class ShmItem 
{ 
public: 
    void* start; 
    void** vtable; 
}; 

這個類是全球性的,全局矢量其一部分。 現在在我的功能。

item.vtable = &item.start; 
shm->address = item.vtable; 

其中item start包含mmap的返回值。

shm是一個參數對象,其中地址的類型是void **。

現在,當我返回給調用者瞧的item.start變化(在shm->address)...

對不起的價值,我已經找到了漏洞,其中有無關的指針。我可以刪除此線程嗎?因爲這個問題再也沒有意義了。 (儘管卡洛斯在funcion調用中傳遞雙指針的方式對我來說是個好主意,所以我將它標記爲已回答)。

+0

請用您想要的語言標記您的問題。 –

回答

0

我假設你使用C權? 所以,我認爲你需要做兩件事。 首先,聲明你在函數之外的雙指針變量,所以它在函數返回後的範圍內。 其次,聲明你的函數,它接收並返回無效** PARAM,將持有你想要的值,例如:

void **myfunc (void **p2) { 
    int x = 10; 
    void* p = &x; 
    p2 = &p; // notice var declaration is gone 
    ... 
    return p2; 
} 
void ** p2; 
p2 = myfunc(p2); 

你也可以聲明MYFUNC返回void並用P2調用MYFUNC無分配結構。

+0

但是,如果這個工作,如果我傳遞一個持有void ** p2成員的對象,那麼它是否也會工作,然後我將它填寫出來並從調用者那裏讀出來。我試過了,但沒有奏效。 * p值已被併發變量覆蓋。 – user1132655

+0

實際上,我嘗試過,如果我使p和x全局化,那麼使用你的方法是避免額外內存分配的一個很好的技巧(這將是非常困難的,以免費)。所以我接受你傳遞雙指針的方法作爲一個好主意! – user1132655

0

您不能以任何有意義的方式獲取局部變量的地址並將其從函數中返回,因爲在函數返回時局部變量將超出範圍。

在下面的代碼,都xp是本地的函數體:

void foo() 
{ 
    int x = 10; 
    void * p = &x; 
} 

唯一明智的指針,你可以通過身邊的那些對象仍然由時間函數返回時,即存在無論是全局對象還是動態分配的對象,或者已經通過轉換爲函數的對象(例如,通過C中的地址或通過C++中的引用)。

+0

對不起,這只是一個例子,變量實際上是全球性的 – user1132655

+0

@ user1132655:在這種情況下,我完全不清楚你的問題是什麼。在這種情況下,'&p'應該是一個有效的表達式。 –

+0

是的,所以p2保持它的值,但* p2以某種方式懸垂,任何不重寫的內存分配將覆蓋它。 – user1132655