C - 返回指针的函数,如何编写高效的代码?

时间:2013-07-13 20:24:05

标签: c pointers memory

如果我有一个任意定义的函数,如:

char* myfunction(int, int[]);

,如图所示,返回一个字符指针。你是否必须在调用函数中写入:

char *ptr = myfunction( ... ); 

或者有没有办法使用函数返回的指针而不创建另一个指向返回的指针?

我问,因为,鉴于我上面的描述,你基本上有一个指针返回,另一个指针分配给那个。因此,您有一个未使用的指针(函数返回的指针)占用内存。

如果无法显式使用返回的指针,是否有办法为返回的指针分配一个新指针并释放未使用的指针?

2 个答案:

答案 0 :(得分:3)

指针是一个非常小的东西。它只是对象地址的表示。你不应该担心创建额外的指针副本(就像创建一个额外的int)。

char* foo() { 
  char* bar;
  // some stuff that mallocs a value and assigns to bar
  return bar;
}

char* x = foo();

在上面的简化示例中,条形指针在堆栈上创建,注释中的代码将其指向堆中的某个内存(使用Malloc或其他内容)。当计算函数foo()时,指针的值(例如,存储器的地址)从堆栈中弹出并分配给x。没有未使用的指针,它刚被重新分配。它指向的内存保持不变,并且不会重复。

您没有创建指针所指向的内存的额外副本。事实上,这是pref指针的一个重要原因,因为它涉及的复制较少。

答案 1 :(得分:2)

函数返回的指针不会在您声明时浪费内存。当函数返回时,并且一旦完成效果ptr = myfunction(...);,返回的值就不再存在于内存中。

但要回答你的问题,是的,你可以直接使用返回的指针,而不需要临时变量。虽然它是一个右值(例如你不能myfunction() = NULL),但是它所指向的位置随时可用:*myfunction() = 3有效,授予返回的指针有效。

我更喜欢使用临时变量,因为您可以在2个或更多表达式中重用该值,并且在我看来它更具可读性。