6 变量作用域与生存期
6.1 作用域
6.1.1 什么是作用域?
变量作用的范围
6.1.2 作用域怎么用?
局部变量作用域在变量定义的大括号以内。
#include <stdio.h>
int main(){
{
int n = 0;
for(int i= 0;i < 10;++i){
n+=i;
}
printf("%d\n",n);
}
{
int n = 10;
printf("%d\n",n);
}
//printf("%d\t%d\n",n,i)
}
6.2 生存期
6.2.1 什么是生存期?
变量从出现到灭亡。
对于局部变量,生存期与作用域一致。
6.2.2 生存期怎么使用?
#include <stdio.h>
int* func(){
int n = 100;
int*p = &n;
return p;
}
int main(){
int* p = func();
// printf("%p\n",p);
printf("%d\n",*p);
}
#include <stdio.h>
#include <stdlib.h>
void PrintArr(int* arr,int n){
for(int i = 0;i < n;++i){
printf("%d ",arr[i]);
}
printf("\n");
}
int* ScanArr(int* n){
int m;
scanf("%d",&m);
//int arr[n]; //不能返回局部变量的地址
int* arr = malloc(sizeof(int)*m);
for(int i = 0;i < m;++i){
scanf("%d",&arr[i]);
}
*n = m;
return arr;
}
int main(){
int n;
int* arr1 = ScanArr(&n);
PrintArr(arr1,n);
free(arr1);
arr1 = NULL;
}
注:不要返回局部变量的地址,不要返回局部变量的地址,不要返回局部变量的地址。
6.3 同名隐藏
在相同作用域中,同名变量会报错;在不同的作用域中,内部变量会隐藏外部变量。
#include <stdio.h>
int n = 10;
void PrintN(){
printf("%p\t%d\n",&n,n);
}
int main(){
printf("%p\t%d\n",&n,n);
PrintN();
int n =100;
printf("%p\t%d\n",&n,n);
{
n = 1000;
printf("%p\t%d\n",&n,n);
}
}
0x601024 10
0x601024 10
0x7ffcc16420ac 100
0x7ffcc16420ac 1000