【问题标题】:Using a pointer to struct returned from a function使用指向从函数返回的结构的指针
【发布时间】:2019-12-19 11:03:08
【问题描述】:

我有一个克隆结构成员并返回结构(非指针)的函数。这个新创建的对象是短暂的。

struct my_struct {
   int a;
   int b;
};

inline struct my_struct my_struct_clone(struct my_struct src, int members){
   struct my_struct copy = {0};
   //... Do copy based on args
   return copy;
}

我无法返回一个指针,因为它会指向已释放的内存。如何将克隆函数的返回值作为指向第二个函数的指针传递?类似于以下内容,但不使用中间占位符。

void do_sth(struct my_struct const *p);

struct my_struct val = my_struct_clone(&other, 123);
do_sth(&val);

以下失败(需要左值作为一元“&”操作数):

do_sth(&(my_struct_clone(&other, 123)));

但是可以声明一个内联结构

do_sth(&(struct my_struct){.a = 1, .b = 2});

解决一些关于使用中间体的问题。问题是关于避免创建一个,而不是“我不能使用一个,因为......”。我最近遇到了一个我认为可以但发现我做不到的编码结构,因此提出了这个问题。此外,将已经分配的实例传递给克隆函数仍然需要一个中间体。我宁愿不要用像这样短暂的变量声明来混淆函数头。

【问题讨论】:

  • 占位符有问题吗?
  • 我不喜欢回答“你为什么要做 A?而不是做 B!”......但是......为什么不实现你的 my_struct_clone() 提供一个指针新分配的结构?当然,您必须设计程序以释放函数外部的内存,但这会阻止您进行奇怪的尝试。
  • 为什么不能使用中间占位符?太可读了?太难维护了?
  • @Lundin 我没有说“不能使用”我问是否有办法“避免”。在想也许我可以使用一些编译器技巧。

标签: c function struct casting return-value


【解决方案1】:

函数返回的值为rvalue, 这意味着它的地址不能被占用。

但是compound literalslvalues,这意味着他们的地址可以被占用。

您需要临时变量才能将克隆函数的结果作为指针传递。

【讨论】:

  • 我猜智能编译器会优化声明(以及伴随的堆栈分配)。
【解决方案2】:

我会亲自做类似的事情:

inline void my_struct_clone(const struct my_struct src, struct my_struct *srcCopy, int members){
   //... Do copy based on args
   srcCopy->a = src.a;
   srcCopy->b = src.b;
}

所以你可以这样调用并声明克隆:

struct my_struct strClone;
my_struct_clone(str, &strClone, 123);
do_sth(strClone); // Call to strClone

【讨论】:

  • 它仍然需要使用中间体,我试图避免这种情况。此外,该功能现在不是真正的clone,而是init(原理图)。
猜你喜欢
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
相关资源
最近更新 更多