使用malloc和void指针复制临时结构

时间:2011-11-22 02:45:35

标签: c++ c pointers embedded avr

我有以下函数,它被称为嵌入式AVR时钟程序模块的开始。我想从clock对象中获取值,该对象将返回date_time结构并将其复制到我从堆中分配的空间中。

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 个答案:

答案 0 :(得分:4)

一种方法是使用memcpy。具体来说,您可能需要memcpy(data, clock->getTime(), sizeof(date_time))

另一种方式 - 可能更好,现在我考虑一下 - 是使用普通的任务:

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

这会将data视为date_time *,并为其指向的date_time对象指定值。

(注意:在上述两个代码段中,我假设clock->getTime()返回date_time *。这是正确的吗?)

顺便说一下,我应该指出data = malloc(sizeof(date_time));将完全取代传入的原始void * data。您的来电者永远不会看到data现在指向的内存位置,因为指针是按值传递的。

答案 1 :(得分: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();

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