首页 > 解决方案 > 函数内的静态变量是否会超出范围?

问题描述

在阅读这个问题时,我注意到一个有趣的场景。这个问题有一个只被调用一次的函数:

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;
}

该函数返回一个指向在函数中定义为静态的数组的指针。我很好奇如何arr2[]处理范围。如果arr2[]定义为非静态,那么它将超出范围,并且您不能假设返回的指针将指向有效数据。

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

标签: c

解决方案


我的问题是,由于 arr2 是静态的,即使定义它的函数永远不会被再次调用,它是否总是在范围内。这是未定义的行为还是我们可以假设它永远不会失去作用域?

如果我们看draft N2310 - 6.2.4 Storage durations of objects

你会看到它声明(强调我的)

  1. 一个对象,其标识符在没有存储类说明符 _Thread_local 的情况下声明,并且具有外部或内部链接或存储类说明符static,具有静态存储持续时间。它的 生命周期是程序的整个执行过程,并且它的存储值仅在程序启动之前初始化一次。

推荐阅读