Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用malloc和void指针复制临时结构_C++_C_Pointers_Embedded_Avr - Fatal编程技术网

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

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)

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

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时间*
。我确实打算完全替换那里的东西。它将被另一个释放