我的问题是关于从c中的函数调用返回值。我已经阅读了有关此主题的许多问题和答案,例如: Returning a local variable confusion in C
我还理解,返回指向局部变量的指针是一个问题,因为局部变量在返回后没有 no limited 个生存期。在下面的情况下,我将返回指针 value 而不是指向局部变量的指针。这样应该可以吗? (即返回&x会很不好)
int *foo(int a) {
int *x; //local scope local lifetime
...
x = &something_non-local;
...
return x; //return value of pointer
}
int main(void) {
int *bar;
bar = foo(10);
}
答案 0 :(得分:1)
您可以这样看。变量代表内存中的位置。变量的生存期由内存中此位置的有效性定义。内存中的位置保持一个值。任何复制操作都只是将值从内存中的一个位置复制到另一位置。
每个这样的存储位置都有一个地址。指向变量的指针只是另一个变量,其值是另一个变量的地址。指针的副本只是地址从一个地方到另一个地方的拷贝。
如果在全局范围内声明了变量,则其内存在程序退出之前将一直有效。如果在过程中非静态地声明了该变量,则该变量的内存在该过程结束之前一直有效。从技术上讲,它可能是分配在堆栈上的,当过程返回时该堆栈将无法分配,从而使该内存无效。
在您的情况下如果指针x
指向全局范围内的变量,则该变量本身在从过程退出之前一直有效。但是,return语句将值从x
复制到另一个位置,就在后者变为无效之前。结果,x
的值将以bar
结尾。该值是仍然有效的静态变量的地址。
如果您尝试返回x
的地址,即&x
,则情况会有所不同。这将是该过程内部存在的内存地址。返回后,它将指向无效的内存位置。
因此,如果您的something_non-local
指向这样的事情,那么您就麻烦了。它应该指向静态对象或堆中的对象。
顺便说一句,malloc
在堆中分配一个有效的内存,直到您使用free
为止。