C++ 使用malloc和void指针复制临时结构
我有以下函数,它被称为嵌入式AVR时钟上程序模块的开始。我想从clock对象获取值,该对象将返回一个日期时间结构,并将其复制到我从堆中分配的空间中C++ 使用malloc和void指针复制临时结构,c++,c,pointers,embedded,avr,C++,C,Pointers,Embedded,Avr,我有以下函数,它被称为嵌入式AVR时钟上程序模块的开始。我想从clock对象获取值,该对象将返回一个日期时间结构,并将其复制到我从堆中分配的空间中 void time_set_mode_start(Display *display, volatile Controls *controls, volatile TimeKeeper *clock, void *data) { DEBUG_LED_PORT |= _BV(DEBUG_LED)
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(data,clock->getTime(),sizeof(date\u time))
另一种方法——也许更好,现在我想起来了——是使用普通赋值:
*((date_time*)data) = *(clock->getTime());
这将数据
视为日期时间*
,并为其指向的日期时间
对象指定一个值
(注意:在上述两个代码片段中,我假设clock->getTime()
返回一个date\u time*
。是否正确?)
顺便说一下,我应该指出,data=malloc(sizeof(date\u time))
将完全替换传入的原始void*数据
。调用方将永远看不到数据现在指向的内存位置,因为指针是按值传递的。一种方法是使用。具体来说,您可能需要memcpy(data,clock->getTime(),sizeof(date\u time))
另一种方法——也许更好,现在我想起来了——是使用普通赋值:
*((date_time*)data) = *(clock->getTime());
这将数据
视为日期时间*
,并为其指向的日期时间
对象指定一个值
(注意:在上述两个代码片段中,我假设clock->getTime()
返回一个date\u time*
。是否正确?)
顺便说一下,我应该指出,data=malloc(sizeof(date\u time))
将完全替换传入的原始void*数据
。调用方将永远看不到数据
现在指向的内存位置,因为指针是按值传递的。调用代码需要为值分配空间,并将其传递到显示为数据
参数的函数中,或者函数原型需要有void**data
,以便函数可以传回值。目前,您的代码用新分配的值覆盖数据的本地副本,然后返回时会泄漏内存
假设原型为date\u time TimeKeeper::getTime()
:
如果原型是date\u time*TimeKeeper::getTime()
,则分配为:
*(date_time *)(*data) = *clock->getTime();
如果是其他内容,您需要告诉我们。调用代码需要为值分配空间并将其传递到显示为数据的函数中,或者函数原型需要具有无效**数据
,以便函数可以传回值。目前,您的代码用新分配的值覆盖数据的本地副本,然后返回时会泄漏内存
假设原型为date\u time TimeKeeper::getTime()
:
如果原型是date\u time*TimeKeeper::getTime()
,则分配为:
*(date_time *)(*data) = *clock->getTime();
如果是别的事情,你需要告诉我们。没有。应该是完整和简洁的。TimeKeeper::getTime的接口规范是什么?没有。应该是完整和简洁的。TimeKeeper::getTime
的接口规范是什么?在这种情况下,需要修改getTime()以返回指针和实际结构?我尝试做一些类似的事情,创建一个临时结构,然后将其地址传递给memcpy。我得到的只是垃圾数据,我相信我得到了一个SEGFULT,但我不能在这个嵌入式系统上说出来。@secretformula:当你发布你的问题时,我完全重写了我的答案。我最初写的很简单,抱歉。谢谢你。看起来它会起作用。我将创建一个单独的方法,返回日期\u时间*
。我确实打算完全替换那里的东西。它将被另一个模块的end方法释放。我会在4分钟内接受当我able@secretformula:可能只是因为您对代码段进行了大量的修剪,导致缺少一些相关的代码,但是--为什么还要传入数据
指针?您当前的代码段从未写入传入的指针;它只是写入调用方从未看到的新空间。乔纳森·莱夫勒(Jonathan Leffler)在下面的回答(作为一种可能性)表明,您的原型应该具有void**pdata
,而不是void*data
,我认为他是对的,这就是您的想法。发生的是程序是模块化的。时钟具有多种功能,即时间、时间设置。。。我希望能够轻松地添加和删除这些功能。所以我有一个2d函数指针数组。每个模块有3个功能:开始、更新、结束。3个功能中的每一个都具有上述原型。上面发布的这个函数是start函数,我想在传递的临时指针上分配空间。然后,它将在update方法中处理这个空间,然后在end方法中释放它。请告诉我是否有更好的方法。/是讨论这个问题的更好地方吗?在这种情况下,需要修改getTime()以返回指针与实际结构?我尝试做一些类似的事情,创建一个临时结构,然后将其地址传递给memcpy。我得到的只是垃圾数据,我相信我得到了一个SEGFULT,但我不能在这个嵌入式系统上说出来。@secretformula:当你发布你的问题时,我完全重写了我的答案。我最初写的很简单,抱歉。谢谢你。看起来它会起作用。我将创建一个单独的方法,返回日期\u时间*
。我确实打算完全替换那里的东西。它将被另一个释放