2011-11-22 58 views
0

我有以下函數被稱爲嵌入式AVR時鐘上的程序模塊的開始。我想從時鐘對象中獲取值,該值將返回一個date_time結構並將其複製到我從堆中分配的空間中。使用malloc和void指針複製臨時結構

void time_set_mode_start(Display *display, volatile Controls *controls, 
         volatile TimeKeeper *clock, void *data) { 

    DEBUG_LED_PORT |= _BV(DEBUG_LED); 
    data = malloc(sizeof(date_time)); 
} 

從clock-> getTime()返回數據到數據指針的返回值的最佳方式是什麼?

+2

沒有[足夠的信息](http://tinyurl.com/so-hints)。 [示例代碼](http://sscce.org/)應該是完整和簡明的。 TimeKeeper :: getTime的接口規範是什麼? – outis

回答

4

一種方法是使用memcpy。具體而言,您可能需要memcpy(data, clock->getTime(), sizeof(date_time))

另一種方式—可能會更好,現在我想想—是使用普通的分配:

*((date_time*)data) = *(clock->getTime()); 

這把datadate_time *,並分配一個值到date_time對象,它指向。

(注:上述兩個代碼片斷,我假設clock->getTime()返回date_time *這是否正確?)

順便說一句,我要指出的是data = malloc(sizeof(date_time));將完全取代原有的void * data傳入。您的調用者將永遠不會看到data現在指向的內存位置,因爲指針正在按值傳遞。

+0

在這種情況下將需要修改getTime()返回一個指針與實際的結構?我嘗試通過創建一個臨時結構來做類似的事情,然後將它的地址傳遞給memcpy。我所得到的只是垃圾數據,我相信我得到了段錯誤,但是我無法告訴這個嵌入式系統。 – secretformula

+0

@secretformula:當您發佈您的問題時,我完全重寫了我的答案。我原來寫的很容易,對不起。 – ruakh

+0

謝謝你看起來像它會工作。我將創建一個返回'date_time *'的單獨方法。我打算完全取代那裏的東西。它將被另一個模塊的結束方法釋放。我會在4分鐘內接受我能夠接受的內容 – secretformula

0

調用代碼需要爲該值分配空間並將其傳遞到參數data所示的函數中,或者函數原型需要具有void **data以便該函數可以將該值傳遞回去。就目前而言,您的代碼會用新分配的值覆蓋data的本地副本,然後在返回時泄漏內存。

假設date_time TimeKeeper::getTime()原型:

void time_set_mode_start(Display *display, volatile Controls *controls, 
         volatile TimeKeeper *clock, void **pdata) 
{ 
    DEBUG_LED_PORT |= _BV(DEBUG_LED); 
    *data = malloc(sizeof(date_time)); 
    *(date_time *)(*data) = clock->getTime(); 
} 

如果原型是date_time *TimeKeeper::getTime(),然後分配是:

*(date_time *)(*data) = *clock->getTime(); 

如果是別的東西,你需要告訴我們。