文章目录
变量的作用域与生存期
变量的隐形性质
变量的作用域与生存期相当于“攻击范围”和“生命力”
1. 作用域
编译时可能出现这样的问题
#include <stdio.h>
int main(){
int n =0;
for(int i=0;i<10;++i){
n += i;
}
printf("%d %d\n",i,n);
}
编译失败:
输出时找不到 i 的定义
大括弧相当于加了一层作用域
局部变量作用域是在变量定义的大括号以内
#include <stdio.h>
int main(){
{
int n =0;
printf("%d\n",n);
}
{
int n =10;
printf("%d\n",n);
}
}
能编译成功
作用域如果出问题,编译器会给报错
2. 生存期
程序中的变量超出生存期,编译器可能不报错
错误:函数中返回局部变量的指针,结果出错
#include <stdio.h>
int* func(){
int n=10;
int* p = &n;
return p;
}
int main() {
int* p = func();
printf("打印这部分没意义\n");
printf("*p = %d\n",*p);
return 0;
}
结果为:
打印这部分没意义
*p = 32766
不要把局部变量的地址传了出去
不要返回函数内定义的指针
错误:函数中返回局部变量的数组地址,吐核
#include <stdio.h>
void print_array(int arr[],int n){
for(int i=0;i<n;++i){
printf("%d ",arr[i]);
}
printf("\n");
}
int* scanf_array(int* n){
scanf("%d",n);
int arr[*n]; // 在函数内定义,是局部变量
for(int i=0;i<*n;++i){
scanf("%d",&arr[i]);
}
return arr; // 不能返回局部变量地址
}
int main(){
int n;
int *arr = scanf_array(&n);
print_array(arr,n);
}
函数 scanf_array 中定义了 arr,但返回 arr 的地址,执行时就会吐核
可以返回地址,但不要返回局部变量的地址
3. 同名隐藏
在同一作用域下,两个变量不能重名
在不同的作用域下,内部变量会隐藏外部变量
同名隐藏会出现这样的问题
#include <stdio.h>
int main(){
int n = 10;
printf("%p %d\n",&n,n);
{
printf("%p %d\n",&n,n);
int n=100;
printf("%p %d\n",&n,n);
n=1000;
}
printf(