return-value - 返回值 - 为什么在C中允许的函数中返回堆栈分配的指针变量?

  显示原文与译文双语对照的内容

我已经阅读了以下帖子:

正在从函数OK返回一个已经分配的指针

显示了一个指向分配给堆的变量的指针,这是很好的。 但是,指针技术上是"堆栈分配的变量",它在函数返回时被释放?

例如:


int* test(){


 int arr[5];


 int *ptr = arr;



 return ptr;//deallocated ptr?


}



int *test2(){


 int arr[5];



 return arr;


}



在测试中

另外,英镑是指向一些新建的int array arr的指针是正确的,指向 &arr[0]

由于ptr和arr都被分配为堆栈,为什么代码只在 test() 中工作,而不是 test2()? test() 是否给出未定义的行为?

时间:

如果返回的值被访问,它们都将是未定义的行为 。 所以,没有一个是"行"。

你正试图返回一个指向块范围变量的指针,该变量是 auto 存储持续时间。 因此,一旦范围结束,变量的生命周期就结束了。

Quoting C11,第1 章,4/p2,关于生命周期 ( 强调扫雷)

对象的生命周期是程序执行的一部分,在这个过程中,存储被保证为它的保留。 对象存在,具有常量地址,并且在整个生存期保留它的上次存储的值。 如果对象在它的生存期之外引用,则为

然后从 P5

如果标识符声明为无链接且没有存储类说明符 static,则该对象的自动存储持续时间为 automatic [... ]

对于这样一个不具有变长 array 类型的对象,它的生存期从入口延伸到该块的执行中。 [... ]

因此,在你的例子中,变量 arr 有自动存储,并且它的生命周期限制在函数体。 一旦将地址返回给调用者,尝试访问该地址的内存将是 UB 。

哦,在C 标准中没有"堆栈"或者"堆",我们只有一个变量的生存期。

在技术上都是相同的。

在这两种情况下,返回一个指向arr的指针。 返回的指针值确实指向用于包含arr的内存,但arr已经从内存中释放。

因这里,当你访问指针时,你仍然会找到它的中的内容,这些内容刚刚被重写。 它的他时候,你可以在重写这里内存之后访问它,并获取未定义的数据或者分割错误。

...