C 函数中的静态变量是否超出范围?

C 函数中的静态变量是否超出范围?,c,C,读这篇文章时,我注意到一个有趣的场景。该问题有一个只调用一次的函数: int* missing_elements(int arr[], int len){ static int arr2[]={0}; for(int i=0,j=1; i < 7; i++,j++){ if(arr[i] != j){ arr2[i]=j; if(arr[i] == j++){ break;

读这篇文章时,我注意到一个有趣的场景。该问题有一个只调用一次的函数:

int* missing_elements(int arr[], int len){

    static int arr2[]={0};

    for(int i=0,j=1; i < 7; i++,j++){
        if(arr[i] != j){
            arr2[i]=j;
            if(arr[i] == j++){
                break;
            }
        }
    }
    return arr2;
}
int*缺少元素(int-arr[],int-len){
静态int arr2[]={0};
对于(int i=0,j=1;i<7;i++,j++){
如果(arr[i]!=j){
arr2[i]=j;
if(arr[i]==j++){
打破
}
}
}
返回arr2;
}
函数返回指向函数中定义为静态的数组的指针。我很好奇
arr2[]
的作用域是如何处理的。如果将
arr2[]
定义为非静态,则它将超出范围,并且您不能假设返回的指针将指向有效数据

我的问题是,因为
arr2
是静态的,所以即使定义它的函数永远不会被调用,它是否始终在范围内。这是一个未定义的行为,还是我们可以假设它永远不会失去作用域

我的问题是,因为arr2是静态的,所以即使 定义它的函数将不再被调用。这是吗 未定义的行为,或者我们可以假设它永远不会失去作用域吗

如果我们看

你会看到它的状态(强调我的)

  • 一种对象,其标识符是在没有存储类的情况下声明的 说明符 _线程_local(具有外部或内部链接,或具有存储类说明符static)具有静态存储持续时间。它的 生存期是程序的整个执行过程及其存储值 在程序启动之前,仅初始化一次

  • 数组
    arr2
    具有静态持续时间(而不是“范围”),因此持续时间与程序的持续时间相同。(它永远不会消失。)范围是编译器担心的事情,它不在函数之外的范围内。存储是处理器担心的事情,static关键字确保它在函数之外是稳定的。当您使用线程时,该存储是否有效是您需要担心的问题,C语言规范对此没有帮助。您的示例是有问题的,因为它由于越界访问而具有未定义的行为。(特殊输入除外)C11 pdf的良好链接。您还可以深入链接到或链接到html。你所拥有的很好,深度链接只允许直接跳到感兴趣的部分。