我有以下函数,它被称为嵌入式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()返回到数据指针的数据的最佳方法是什么?
答案 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();
如果是别的,你需要告诉我们。