2

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

char* myfunction(int, int[]);

如图所示,它返回一个字符指针。您是否必须在调用函数中编写如下内容:

char *ptr = myfunction( ... ); 

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

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

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

4

2 回答 2

3

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

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

char* x = foo();

在上面的简化示例中,条形指针是在堆栈上创建的,注释中的代码将其指向堆中的某个内存(使用 Malloc 或其他东西)。当函数 foo() 被求值时,指针的值(例如内存的地址)从堆栈中弹出并分配给 x。没有闲置的指针,它只是被重新分配。它指向的内存准确地保留在它所在的位置并且没有被复制。

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

于 2013-07-13T20:26:17.587 回答
2

正如您所说,函数返回的指针不会浪费内存。当函数返回时,一旦做作ptr = myfunction(...);完成,返回的值就不再存在于内存中。

但是要回答您的问题,是的,您可以直接使用返回的指针,而无需使用临时变量。尽管它是一个右值(例如,您不能这样做myfunction() = NULL),但它指向的位置由您支配:*myfunction() = 3是有效的,只要返回的指针有效。

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

于 2013-07-13T20:32:27.740 回答