2011-11-22 59 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(); 

如果是别的东西,你需要告诉我们。