外部变量就是引用外部文件的变量(非静态)
静态变量与全局变量相似,区别是静态变量只能在定义的函数内被调用。
静态变量与局部变量区别:静态变量不会自动释放,函数调用结束后,值依然保留。静态变量定义时赋初值,只有一次,多次调用函数,不会反复赋初值。如果没有初值,静态变量也会自动赋初值。
关于数组定义在栈中维度大小受限,想要定义在堆中,可以用malloc申请。
详细看我写的案例备注吧。
![](https://video.ask-data.xyz/img.php?b=https://iknow-pic.cdn.bcebos.com/279759ee3d6d55fb2a53d24961224f4a21a4ddcc?x-bce-process=image%2Fresize%2Cm_lfit%2Cw_600%2Ch_800%2Climit_1%2Fquality%2Cq_85%2Fformat%2Cf_auto)
#include<stdio.h>
#include"externFile.c"//外部文件
#include<malloc.h>
extern struct book2 b2;//外部变量:这里的结构变量b2是使用的externFile.c文件中的变量(externFile.c和本文件在同一个目录下)
extern struct book3 b3;
typedef struct book//这里申明的是结构类型
{
int id;
};
int test();
int main()
{
int size;
b2.id=100;
//b3.id=100;这里会报错,因为b3是外部的静态全局变量,无法引用
printf("外部结构变量b2.id=%d\n",b2.id);
size=10000;
struct book *bkp=(struct book *)malloc(sizeof(struct book)*size);//用堆 定义结构数数,size是大小,这里相当于定义了struct book bkp[10000]
bkp[0].id=100;
printf("malloc申请了%d大小的结构数组空间,bkp[0].id=%d\n",size,bkp[0].id);
test();//该函数调用后,其局部变量被赋值。对比两次调用,可见静态变量保留值功能
test();
return 0;
}
int count=0;
int test()
{
struct book bk1={0};//局部变量:这里结构数组变量是自动存储,存放在栈中。只在本函数适用,每调用结束,自动释放,值不保留。
static struct book bk2;//静态局部变量:每次调用函数,值保留,不自动释放。静态变量即使没有初值,会自动赋初值0/
count++;
printf("第%d次调用函数,局部变量bk1.id=%3d,静态局部变量bk2.id=%3d,之后给两个成员都赋值100\n",count,bk1.id,bk2.id);
bk1.id=100;
bk2.id=100;
}//externFile.c文件
#include<stdio.h>
struct book2
{
int id;
};
struct book3
{
int id;
};
struct book2 bk2;
static struct book3 bk3;//b3是静态全局变量,无法通过extern被外部调用