static用法详解

1.生存周期问题

#include <stdio.h>
#include<string.h>
char * mystring()
{
    char str[20];
    strcpy(str,"hello");
    return str;
}
int main(int argc, char const *argv[])
{
    printf("%s\n",mystring());
    return 0;
}
  • 上面代码执行出现的问题是,str作为局部变量,出了函数(作用域{ })就会被销毁,此时mystring返回值为一个野指针;
  • 解决方法是想办法提高str变量的生存周期;
  • 可以通过static提高其生命周期,或者malloc申请堆空间来解决;
  • 注意static +局部变量只是让它的生命周期持续到程序运行结束,其作用域仍然是mystring函数,故有static变量的作用域<=生命周期;

2.正确代码如下

  • 方法1
char * mystring()
{
    static char str[20];
    strcpy(str,"hello");
    return str;
}
  • 方法2
char * mystring2()
{
    char *str=(char *)malloc(sizeof(char)*20);
    strcpy(str,"hello");
    return str;
}
int main(int argc, char const *argv[])
{
    char *ret=mystring2();
    printf("%s\n",ret);
    free(ret);
    return 0;
}    

3.static的作用

  1. 在函数体内,一个被声明为静态的局部变量,在这一函数被调用的过程中维持其值不变;
  2. 在模块内(但是在函数体外),一个被声明为静态的全局变量可以被模块内的所有函数访问,但不能被模块外的其他函数访问,是一个本地化的全局变量,其他文件不能通过extern使用该全局变量;
  3. 在模块内,一个被声明为静态的函数只可被这一模块内的其他函数调用,这个函数被限制在声明它的模块的本地范围内使用,故不同文件可以使用相同名字的静态函数;

4.static全局变量和普通全局变量的区别

主要作用是限制其作用域,static全局变量只初始化一次,防止在其他文件单元中被引用。

详解:
全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。
这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

5.static局部变量和普通局部变量的区别

主要作用是提高其生命周期,而改变不了其作用域,static局部变量只被初始化一次,下一次依据上一次的结果值。

详解:

void static_test()
{
int m=3;
static int n=5;
}

局部变量m存放在栈中,当test函数结束,m将被销毁;静态变量n不存放在栈中,而是存放于程序的全局变量区域,因此随着函数test的结束,它并不随着出栈操作而被销毁,它的生存周期存在于程序的整个运行期;然而m和n的作用域都仅存在于test函数中它们的定义之后,即test调用结束之后,m和i就不再可用,但是i仍存在于内存之中。

6.static函数和普通函数的区别

主要目的是限制其作用域,static函数在内存中只有一份,普通函数在每个被调用中维持一份复制品。
static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static修饰的函数),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值