繁体   English   中英

强制指向结构的空指针或指向新结构的memcpy?

[英]Cast a void pointer to a struct or memcpy to new struct?

我正在将void *作为参数传递给函数foo(void* parm)的参数,该函数调用函数bar(STmyStruct* parm)我应该将void指针转换为STmyStruct*还是创建一个新结构,memcpy void*指向和然后将指针传递给该结构? 我想解决方案A更有效?

A:    foo(void* parm)
      {
       bar((STmyStruct*) parm)
      }

B:    foo(void* parm)
      {
       STmyStruct myStr;
       memcpy(&myStr, parm, sizeof(STmyStruct));
       bar(&myStr)
      }


bar(STmyStruct* mystr);
  • 如果您完全可以避免处理void* ,请这样做。 但是您可能受到现有API的约束。
  • 如果void*实际上指向STmyStruct* ,则进行STmyStruct*
  • 如果void*不是指向STmyStruct*而是某种与布局兼容的(因此跨STmyStruct*是合法的),这种情况很少见,那么由于别名规则或风险,您必须选择选项B混淆了编译器。

实际上,这两个解决方案做不同的事情,解决方案A是您通过引用传递参数,因此,如果您在函数bar更改,则将更改传递给foo ,这意味着:

STmyStruct test;
// your code that uses test
foo(test);

如果功能栏更改了mystr参数,您也将更改测试。

但是在解决方案B中,您将使用memcpy复制参数parm ,因此,如果功能bar更改其参数,则不会更改parm 它的意思是:

STmyStruct test;
// your code that uses test
foo(test);

即使您在功能bar更改参数mystr ,测试也不会更改,因为您将其值复制到myStr

这取决于您的用例。 通常,假设parm确实指向STMyStruct类型的对象,两者都很好。

如果bar修改了mystr并且您想要修改原始param ,则必须使用选项A。

如果它修改了mystr并且您不希望修改param ,则需要选项B。

如果bar不修改mystr ,那么A会更有效,但是B也不会有问题。 (除非B在任何地方都存储了指向mystr的指针。)

这取决于您是否希望bar修改具有指针的项目,还是希望它在副本上工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM