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