为什么递增接收到数组地址的指针的行为与使用该地址初始化的指针不同?

Why when incrementing a pointer which received an address of an array behaves differently from the one that has been initialized with the address?

案例 1:

#include<iostream>
using namespace std;

int* exp()
{
    int a[6]={1,2,3,4,5,6};
    
    return a;   
} 

int main()
{   
    int *p=exp();
    
    for(int i=0;i<6;i++)
    {
        cout<<*p<<" ";
        p++;
    }
    
    return 0;
}

输出:

#include<iostream>
using namespace std;

int main()
{   

    int a[6]={1,2,3,4,5,6};
    
    int *p=a;
    
    for(int i=0;i<6;i++)
    {
        cout<<*p<<" ";
        p++;
    }
    
    return 0;
}

输出:

为什么上面两种情况返回的指针地址相同,但结果不同? 另外,我正确地增加了指针(正如我认为的那样),因此它在两种情况下的行为应该相同,但为什么会发生这种情况? 请帮帮我,我不明白这里到底发生了什么。

当您在第一种情况下离开函数 exp() 时,a 超出范围,即该数组最初占用的内存可能已被用于其他目的。指向此内存位置的指针不再有效。