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;
}
}
}
return arr2;
}
该函数返回一个指向在函数中定义为静态的数组的指针。我很好奇如何arr2[]
处理范围。如果arr2[]
定义为非静态,那么它将超出范围,并且您不能假设返回的指针将指向有效数据。
我的问题是因为arr2
它是静态的,即使定义它的函数永远不会被再次调用,它是否总是在范围内。这是未定义的行为还是我们可以假设它永远不会失去作用域?
解决方案
我的问题是,由于 arr2 是静态的,即使定义它的函数永远不会被再次调用,它是否总是在范围内。这是未定义的行为还是我们可以假设它永远不会失去作用域?
如果我们看draft N2310 - 6.2.4 Storage durations of objects
你会看到它声明(强调我的)
- 一个对象,其标识符在没有存储类说明符 _Thread_local 的情况下声明,并且具有外部或内部链接或存储类说明符static,具有静态存储持续时间。它的 生命周期是程序的整个执行过程,并且它的存储值仅在程序启动之前初始化一次。
推荐阅读
- html - 从 CSS 风格化复选框中删除标签顶部的额外空间
- django - 将表单 POST 值从一个视图传递到另一个视图而不包含 URL
- python - 匹配两个 DataFrame 的更快方法
- php - php输入值更改并更新数据库
- mongodb - 使用 docker-compose 运行时的最大 MongoDB 连接数
- reactjs - 普通文本字段的最佳验证标准是什么
- python - 如何有效地将点云数据的大型 numpy 数组转换为下采样的二维数组?
- css - 显示div时居中对齐flexbox在IE11中不起作用
- bash - 使用 sed 命令在文件中添加带反斜杠的字符串
- vim - 在 .vimrc 中设置 background=dark 不会改变 vims 背景