[英]C: Allocating structs using memcpy
我正在看一些如下的代码:
void whatDoesThisDo(uint8_t *source)
{
STRUCT_T *pStruct;
memcpy(&pStruct, source, sizeof(STRUCT_T));
// this function does some stuff with struct contents
useStruct(pStruct);
}
该函数的目的是从缓冲区“源”中填充结构,然后调用“ useStruct”(后者将根据传递给它的结构的指针的内容来更新全局变量)。
我认为代码为堆栈上的指针分配了内存(因此指向某个随机位置),然后内存复制从“源”中推送字节(覆盖pStruct,因此现在指向其他地方),而useStruct使用pStruct的内容作为指向的指针结构。
原始代码:
STRUCT_T *pStruct;
memcpy(&pStruct, source, sizeof(STRUCT_T));
副本STRUCT_T
到STRUCT_T*
,这是一个编程错误。
您可能想要的是:
void whatDoesThisDo(uint8_t *source)
{
STRUCT_T Struct; // Allocate a Struct on the stack.
memcpy(&Struct, source, sizeof(STRUCT_T));
// this function does some stuff with struct contents
useStruct(&Struct);
}
假定source
指向STRUCT_T
。
如果source
是正确的对齐STRUCT_T
,那么这个功能可能只是:
void whatDoesThisDo(uint8_t *source)
{
useStruct((STRUCT_T*)source);
}
目前无法使用。
如果希望pStruct
具有动态存储持续时间 ,则需要自己为目标缓冲区pStruct
分配内存。 为此使用malloc
。 然后使用memcpy(pStruct, source, sizeof(STRUCT_T));
复制结构。 请注意,我传递的是pStruct
,而不是memcpy
的地址 。
另外,您可以将pStruct
定义为具有自动存储时间; 即写
STRUCT_T pStruct;
(也许重命名该变量,使其看起来不像指针类型),并使用memcpy(&pStruct, source, sizeof(STRUCT_T));
该功能的目的是从缓冲区“源”中填充结构
您尚未创建任何要填充的结构。
然后调用“ useStruct”(它会根据传递给它的struct的指针内容更新全局变量)。
那部分没问题。
我认为代码为堆栈上的指针分配了内存(因此指向某个随机位置),
是。 指针的存储是这里的关键。 不是该结构的内存。
然后,内存复制会从“源”中推送字节(覆盖pStruct,因此现在指向其他位置),
是。 但是您用结构本身覆盖了指针。 指针现在没有任何意义。 另外,指针通常比结构小得多,因此您不仅要覆盖指针,而且还要覆盖其后的一些内存。 这是非常糟糕的事情,因为没有人能告诉谁使用了该内存以及用于什么用途,因此那里可能存在重要的事情,并且您现在已经使程序不稳定。
useStruct使用pStruct的内容作为struct的指针。
是的,它使用pStruct的内容作为struct的指针-但正如我所说的,它现在包含struct本身,而不仅仅是一个指针。
您必须将指针视为不同于其所指向的类型。 例如,我的手指是指针,而我指的是自由女神像。 您所做的是将自由女神像的内容复制到一根手指上。 不适合 您需要的是再获得一个雕像大小的存储位置,在其中复制原始雕像,然后您可以用一根手指将其指向新雕像。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.