为什么返回局部变量地址会抛出错误,而返回局部变量值却不会?

why does returning the local variable address throws an error but returning the local variable value don't?

看不懂,下面的函数体有什么区别

int func(void){
    int A = 20;
    return A;
}

int* func(void){
    int A = 20;
    return &A;
}

为什么返回值不会抛出段错误,但返回地址会抛出?

具有自动存储持续时间的局部变量在退出定义它的函数范围后不存在。所以返回的指针将是无效的,de-referencing 这样的指针会调用未定义的行为。

如果您将按以下方式更改第二个函数

int* func(void){
    static int A = 20;
    return &A;
}

然后返回指向变量的指针A将是正确的,因为具有静态存储持续时间的变量在退出函数后仍然存在。

返回值可以分配给变量或丢弃。所以没有错。

尝试针对 follow-up 对其他几个答案的评论中提出的更具体的问题:

if the address of the local variable after the scope gets deleted then how the value of that address preserved? in case of returning local variable value from the function? this is I can not understand

返回一个值会复制那个值,到调用者提供的存储位置。你大概有类似

的东西
void call_func(void) {
   int n = func();
   printf("%d\n", n);
}

作为调用 func 的函数——因此,当 func returns 是 A 的值时,该值被复制到 n 中。

返回指向A的指针实际上是完全一样的:一个值被复制到调用者提供的存储位置。只不过现在复制出来的值,是原来A占用的存储位置的地址。