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

Copy a temporary structure using malloc and a void pointer

本文关键字:一个 结构 复制 void 使用 malloc 指针      更新时间:2023-10-16

我有以下函数,该函数被称为嵌入式AVR时钟上程序模块的开始。我想从时钟对象中获取值,它将返回一个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()返回数据指针的最佳方法是什么?

一种方法是使用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现在指向的内存位置,因为指针是通过值传递的。

调用代码需要为值分配空间并将其传递给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();

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

相关文章: