2015-04-22 63 views
0

我很努力地處理我在一段C++代碼中的指針。事不宜遲,讓我告訴你我的代碼的一部分:正確取消引用指針

file1.cpp

void *SomeClass::extract() 
{ 
    double foo = 3.14; 
    return (void*) &foo; // returns the pointer to a double 
} 

file2.cpp

void * bar = SomeClass->extract(); // fetches the pointer to a double 
fprintf(screen, "pointer address: %p \t value: %.3e \n", bar, (double*) bar); 

(由於代碼的龐大的過於簡單化的,有可能是不一致)我基本上想要做的是打印file2.cpp中的foo的值,通過調用file1.cpp中的函數檢索該值。當我比較foobar的指針地址時,我發現它們是相同的。但是當我想要提取指針時,我得到了僞造。我懷疑我在解引用中做錯了什麼,但是當我將其與代碼的其他部分(我沒有按照自己的方式編寫)進行比較時,它似乎是有效的。

我知道這應該是非常基本的C++,但不知何故它不適合我。如果有人能夠向我解釋如何正確完成,我將非常感激。

的Martijn

+3

*(double *)bar – user3528438

+0

'(double *)'bar僅將條形轉換爲類型爲'double *'的指針。您仍然需要取消引用指針 – mstbaum

+0

您正在返回一個指向堆棧的指針。下一個函數會用什麼來覆蓋它。 –

回答

4

您正試圖返回一個指向自動變量,將被儘快extract函數退出銷燬。然後嘗試解引用指向無效對象的指針,這是未定義的行爲。

如果你想從一個函數返回一個指針,你需要在自由存儲區爲它分配內存,然後返回指針,記得以後將其刪除:

double *SomeClass::extract() 
{ 
    double *foo = new double(3.14); 
    return foo; 
} 

然後在得到該指針的值,則需要取消對它的引用:

double * bar = SomeClass->extract(); // fetches the pointer to a double 
fprintf(screen, "pointer address: %p \t value: %.3e \n", bar, *bar); 

或者,如果你堅持要用void*出於某種原因,一定要取消引用指針轉換的結果是:

void * bar = SomeClass->extract(); // fetches the pointer to a double 
fprintf(screen, "pointer address: %p \t value: %.3e \n", bar, *(double*) bar); 
//              here^

但是,像double這樣的內建類型被設計爲按值傳遞,因此通常不應該動態分配它們。

double SomeClass::extract() 
{ 
    return 3.14; 
} 
+0

感謝您的回覆。您的一些評論不適用於我的代碼,儘管在我的簡單示例中可能會出現這種情況。但是,你的'*(double *)'爲我做了竅門。 – MPA

+1

@MPA什麼不適用?無論你在做什麼,這聽起來都很可靠。 Arnd你是否確實需要返回一個指針,特別是void *?也許你可以發佈更多關於你的用例的例子 – evan

+0

@evan'extract()'函數應該能夠返回'int','double'和'double **',這樣看來我不得不求助於返回'void *'指針。如果您知道其他方法,請告訴我。 – MPA