C 为什么在为指针分配带静态关键字的数组和不带静态关键字的数组时会有差异?

C 为什么在为指针分配带静态关键字的数组和不带静态关键字的数组时会有差异?,c,arrays,pointers,C,Arrays,Pointers,以下代码正常工作,并给出输出4: int main() { int *res = valout(); printf("%d", res[0]); } int *valout() { static int arr[] = {4, 5, 6}; return arr; } 下面的代码返回一个分段错误: int main() { int *res = valout(); printf("%d", res[0]); } int *valout()

以下代码正常工作,并给出输出4:

int main()
{

    int *res = valout();
    printf("%d", res[0]);
}

int *valout()
{
    static int arr[] = {4, 5, 6};
    return arr;
}
下面的代码返回一个分段错误:

int main()
{

    int *res = valout();
    printf("%d", res[0]);
}

int *valout()
{
    int arr[] = {4, 5, 6};
    return arr;
}
为什么我们在案例2中得到一个错误而在案例1中没有?静态关键字在这里扮演什么角色? 请详细说明这个问题。

这是因为:

static int arr[] = {4, 5, 6};
创建一个
静态
数组(显然),定义为从创建到程序退出的变量。

另一方面:

int arr[] = {4, 5, 6};
创建一个变量,该变量仅存在于定义它的函数(或块)的有限范围内。当函数退出时,它将停止。

在这两种情况下,
return arr
返回该数组第一个元素的地址。不幸的是,对于非静态变量,没有正确的方法来使用该地址,因为它所引用的底层对象已不再存在。因此,它会抱怨它


静态
版本在程序退出前一直存在,可在函数退出后使用。

静态
变量具有静态存储持续时间,该存储持续时间具有程序生存期

自动变量具有自动存储持续时间,并且仅在定义它们的范围内(在您的情况下为函数范围)存在


当您返回对自动变量的引用时,您将返回对不存在的对象的引用。这是UB

因为静态变量和局部变量之间存在差异,所以在第一个程序中定义

static int arr[] = {4, 5, 6};
该变量(arr)将一直存在(定义),直到程序的fish结束。因此,当您在主函数中调用valout()函数时,然后打印静态变量中存在的第一个元素,它仍然会退出(因为在程序完成之前,它不会从内存中删除) 但是在第二个程序中,您将数组定义为(一个局部变量),因此只有在主函数中调用它时,它才会在{}of valout()函数之间定义

 int *res = valout();

程序将执行此函数,但您希望打印arr编译器的第一个元素,因为一旦valout()被删除,它将从内存中删除函数退出

,因为
静态
变量即使在控件离开函数后仍然存在,而简单变量将自动释放。因此,在案例2中,您返回指向无效内存位置的指针。