关于返回值和可变寿命的澄清

时间:2019-04-17 21:21:18

标签: c local-storage

我的问题是关于从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);
}

1 个答案:

答案 0 :(得分:1)

您可以这样看。变量代表内存中的位置。变量的生存期由内存中此位置的有效性定义。内存中的位置保持一个值。任何复制操作都只是将值从内存中的一个位置复制到另一位置。

每个这样的存储位置都有一个地址。指向变量的指针只是另一个变量,其值是另一个变量的地址。指针的副本只是地址从一个地方到另一个地方的拷贝。

如果在全局范围内声明了变量,则其内存在程序退出之前将一直有效。如果在过程中非静态地声明了该变量,则该变量的内存在该过程结束之前一直有效。从技术上讲,它可能是分配在堆栈上的,当过程返回时该堆栈将无法分配,从而使该内存无效。

在您的情况下如果指针x指向全局范围内的变量,则该变量本身在从过程退出之前一直有效。但是,return语句将值从x复制到另一个位置,就在后者变为无效之前。结果,x的值将以bar结尾。该值是仍然有效的静态变量的地址。

如果您尝试返回x的地址,即&x,则情况会有所不同。这将是该过程内部存在的内存地址。返回后,它将指向无效的内存位置。

因此,如果您的something_non-local指向这样的事情,那么您就麻烦了。它应该指向静态对象或堆中的对象。

顺便说一句,malloc在堆中分配一个有效的内存,直到您使用free为止。