使用malloc和一个void指针复制一个临时结构
Copy a temporary structure using malloc and a void pointer
我有以下函数,该函数被称为嵌入式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();
如果是别的事情,你需要告诉我们
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么将一个结构的引用设置为等于另一个结构只会更改一个数据成员?
- 如何将一个结构的字符数组复制到结构的另一个字符数组中?
- 如何将数据从一个结构链接到另一个结构
- 是否可以使用智能指针成员设置具有另一个结构的结构?
- std::transform 将一个结构数组复制到另一个结构数组
- 输入 ctrl + x 后如何再次 cin (cin<<x) 循环(cin 一个结构)
- 如何在级别上打印树,给定一个结构,该结构保存节点的值及其父节点的值,对于树中的每个节点
- 创建一个结构的关联数组,以创建一个缓冲区,供键快速访问
- 如何在另一个结构中初始化结构数组?
- 在另一个结构中声明内部结构会导致错误:结构使用无效
- 我想重置一个C++结构统计,我可以以某种方式使用 stat() 语法吗?
- C++可以输出一个结构的内存地址吗
- 通过 C++ 中的另一个结构成员访问结构
- C++ push_back() 一个结构体到一个向量中
- 难以从另一个结构中的函数返回结构
- 如何将向量添加到结构中以创建一个库存系统,在该系统中,我可以仅使用一个结构向系统添加多种不同的葡萄酒
- 如何制作一个结构程序,在其中可以存储无限量的数据,以便每次您想要时都可以将另一个产品添加到列表中?
- 将一个结构的值复制到另一个结构
- 是否可以在同一未创建的结构内创建一个结构