c语⾔中static⽤法详解
c语⾔中static关键字有两个作⽤,⼀是⽂件作⽤域,⼆是函数作⽤域。
⼀、⽂件作⽤域
⽂件作⽤域关键字static的作⽤是,以static申明的全局变量、函数不得被其他⽂件所引⽤,例如:
//这是mystr.c⽂件的内容
#include <string.h>
static int num = 10;
int mynum = 100;
static int str_len(char *str)
{
return strlen(str);
}
int mystr_len(char *str)
{
return str_len(str) + num;
}
当你mystr.c⽂件中的str_len函数加上了static关键字,你便不能在其他的地⽅复⽤这个函数,譬如,你不能这样写:
//这是main.c 的内容
#include <stdio.h>
int main()
{
int len;
len = str_len("hello, world/n");
printf("%d %d/n", num, len )
return 0;
}
gcc main.c mystr_len.c
将不能编译通过,因为mystr.c中的num变量和str_len函数都⽤了static关键字,导致他们只能在mystr.c中被使⽤,如⽂件中的mystr_len函数可以引⽤num变量和str_len函数。
//这是main.c 的内容
#include <stdio.h>
int main()
{
int len;
len = mystr_len("hello, world/n");
printf("%d %d/n", my_num, len )
return 0;
}
当不⽤static关键字时,等同于extern,即
int mystr_len(char *str)
{static修饰的变量
return str_len(str) + num;
}
extern int mystr_len(char *str)
{
return str_len(str) + num;
}
是⼀样的。
⼆、函数作⽤域
static另外⼀个⽤途是函数内部静态变量,最常⽤的情况是
int *test()
{
int num = 100;
int *ptr = &num;
return ptr;
}
int main()
{
printf("%d/n", *test);
return 0;
}
该函数返回整数num的指针,在main函数中打印*test将会出现段错误,因为num做为test函数内部,只能在test内部被访问。以下程序是正确的。
int *test()
{
static int num = 100;
int *ptr = &num;
return ptr;
}
int main()
{
printf("%d/n", *test);
return 0;
}
该 程序中num变量加了关键字static,函数运⾏结束后,依然可以在其他地⽅被引⽤,只是不能直接通过变量名访问,⽽要间接通过指针访问,原因是 static变量存储在全局数据段中⽽不是函数栈中。读者可以将它看作特殊的全局变量,只是其他地⽅只能通过指针来访问,⽽不能直接通过变量名访问。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。