当函数返回时,临时存储如何在C中工作?

Luc*_*eis 2 c memory-management

我很了解C,但我对临时存储的工作原理感到困惑.

就像函数返回时一样,所有在该函数内发生的分配都被释放(从堆栈中或者实现决定这样做).

例如:

void f() {
    int a = 5;
} // a's value doesn't exist anymore 
Run Code Online (Sandbox Code Playgroud)

但是我们可以使用return关键字将一些数据传输到外部世界:

int f() {
    int a = 5;
    return a;
} // a's value exists because it's transfered to the outside world
Run Code Online (Sandbox Code Playgroud)

如果有任何错误,请阻止我.

现在这是奇怪的事情,当你这样做时arrays,它不起作用.

int []f() {
    int a[1] = {5};
    return a;
} // a's value doesn't exist. WHY?
Run Code Online (Sandbox Code Playgroud)

我知道数组只能通过指针访问,如果不使用指针,就不能像其他数据结构那样传递数组.这是你无法返回数组并在外界使用它们的原因吗?因为它们只能通过指针访问?

我知道我可以使用动态分配将数据保存到外部世界,但我的问题是关于临时分配.

谢谢!

GMa*_*ckG 10

返回某些内容时,会复制其值.a没有在你的第二个例子中,函数之外存在; 它的价值确实如此.(它作为右值存在.)

在上一个示例中,您隐式将数组转换a为a int*,并返回该副本.a生命结束了,你指的是垃圾.

从来没有任何变量超出其范围.

  • @thethimble.当然有区别.见K&R,第5.2节.数组不能是左值.根据上下文,这两个事物具有相似的行为,但它们强调的不仅仅是同一事物的句法变体. (3认同)