c语言中static 用法总结

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

一、c程序存储空间布局

C程序一直由下列部分组成:

          1)正文段--CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;
          2)初始化数据段(数据段)--在程序中所有赋了初值的全局
变量,存放在这里。
          3)非初始化数据段(bss段)--在程序中没有初始化的全局变量;内核将此段初始化为0。
          4)栈--增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。
          5)堆--动态存储分。

|-----------|
|                                |
|-----------|
|      栈                | 
|-----------|
|      |                      |
|    |/                    |
|                                |
|                                |
|    /|                    |
|      |                      |
|-----------|
|      堆                |
|-----------|
| 未初始化  |
|-----------|
|    初始化  |
|-----------|
|  正文段    |
|-----------|

二、 面向过程程序设计中的static

1. 全局静态变量

    在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。

    1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)

    2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)

    3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。


看下面关于作用域的程序:
//teststatic1.c
void display();
extern int n;
int main()
{
  n = 20;
  printf(" %dn" ,n);
  display();
  return 0;
}
 
//teststatic2.c 
static int n;     //定义全局静态变量,自动初始化为0,仅在本文件中可见
void display()
{
  n++;
  printf(" %dn" ,n);
}
 

文件分别编译通过,但link的时候teststatic2.c中的变量n找不到定义,产生错误。
 
定义全局静态变量的好处:

< 1> 不会被其他文件所访问,修改

< 2> 其他文件中可以使用相同名字的变量,不会发生冲突。

2. 局部静态变量

  在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。

  1)内存中的位置:静态存储区

  2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)

  3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。

  注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。

          当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区中。

3. 静态函数

  在函数的返回类型前加上关键字static,函数就被定义成为静态函数。

  函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。

  例如:
//teststatic1.c
void display();
static void staticdis();
int main()
{
  display();
  staticdis();
  renturn 0;
}
 
//teststatic2.c
void display()
{
  staticdis();
  printf(" display() has been called n" );
}
 
static void staticdis()
{
  printf(" staticDis() has been calledn" );
}
 
文件分别编译通过,但是连接的时候找不到函数staticdis()的定义,产生错误。
  实际上编译也未过,vc2003报告teststatic1.c中静态函数staticdis已声明但未定义 ;by imjacob
定义静态函数的好处:

< 1> 其他文件中可以定义相同名字的函数,不会发生冲突

< 2> 静态函数不能被其他文件所用。
 
存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。
 
auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。

关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态存储持续期(static storage duration),或静态范围(static extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的声明处时被首次初始化。

由于static变量的以上特性,可实现一些特定功能。

1. 统计次数功能

声明函数的一个局部变量,并设为static类型,作为一个计数器,这样函数每次被调用的时候就可以进行计数。这是统计函数被调用次数的最好的办法,因为这个变量是和函数息息相关的,而函数可能在多个不同的地方被调用,所以从调用者的角度来统计比较困难。代码如下:
 
void count();
int main()
{
  int i;
  for (i = 1; i < = 3; i++)
  count();
  return 0;
}
void count()
{
  static num = 0;
  num++;
  printf(" I have been called %d" ,num," timesn" );
}

输出结果为:
I have been called 1 times.
I have been called 2 times.
I have been called 3 times.

C语言static用法与总结 详细介绍和总结说明static关键字的用法 阅读详情

相关推荐

C++类的静态成员变量使用须知

今天,在试着使用gtest的 TestSuite事件 时发现,类的静态成员变量在main入口之前必须要初始化,继而查了查类静态成员的使用问题。        首先来看看,为何gtest的 TestSuite事件 中会涉及到类的静态成员变量的使用呢?        gtest的 TestSuite事件 必须要实现两个静态方法,SetUpTestCase() 方法在第一个TestCase之前执行,Te

蓝月的职场人生 874

一文学会gtest UT测试编写(TEST\TEST_F)

手把手教你学会gtest写UT测试

weixin_36389889的博客 2311

Gtest入门2 Gtest之TEST宏的用法

Googletest宏的用法(整理)1. TestCase的介绍2. TEST宏3. TEST_F宏4. TEST_P宏5. EXPECT_*和ASSERT_*的宏介绍5.1.gtest之断言5.2. gtest断言分类5.2.1 Boolean断言类型5.2.2 二元值断言类型5.2.3 字符串断言类型6. EXPECT_CALL7. 调用测试 1. TestCase的介绍 本章节主要介绍在使用...

sevenjoin的博客 1万+

C语言static关键字详解

static,英文意思静态的,作为C语言常用关键字中一个很重要的关键字,其用法多样且比较难以理解,本篇博客将带你详细了解掌握关键词static用法......

weixin_62604754的博客 1万+

static用法总结

一、c程序存储空间布局C程序一直由下列部分组成:      1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;      2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。      3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。      4)栈——增长方向:自顶向下增长

mervy的专栏 1030

c语言static用法_C语言关键字 static用法

接上文:C语言的32个关键字C语言 static 关键字的常见用法有三种:用于局部变量的修饰符;用于全局变量的修饰符;用于函数的修饰符。1、用于局部变量的修饰符当 static 用于修饰局部变量时,通常是在某个函数体内,只能在该函数内被调用。这样定义的变量通常被称为局部静态变量,它的值不会因为函数调用的结束而被清除,当函数再次被调用时,它的值是上一次调用结束后的值。如下面这段代码所示,变量 x 是...

weixin_35756130的博客 2万+

C语言static、const、typedef的用法

一、static关键字 1、定义: 实际开发中,我们通常将不需要被其他模块调用的全局变量或函数用 static 关键字来修饰,static 能够将全局变量和函数的作用域限制在当前文件中,在其他文件中无效。下面我们通过一个实例来演示。 module.c 源码: main.c 源码: 运行结果: http://c.biancheng.net n = 100 2、static 局部变量 static 除了可以修饰全局...

一只特立独行的zhu.. 1223

static在c语言中的用法

static在c语言中的三种简单用法 在c语言中: static用来修饰变量和函数 1.修饰局部变量-静态局部变量 2.修饰全局变量-静态全局变量 3.修饰函数-静态函数 修饰局部变量 //代码1 #include<stdio.h> void test() { int i=0; i++; printf("%d ",i); } int main() { for(i=0;i<...

菜鸡的博客 2910

static在c语言中的作用_C语言关键字 static用法

接上文:C语言的32个关键字C语言 static 关键字的常见用法有三种:用于局部变量的修饰符;用于全局变量的修饰符;用于函数的修饰符。1、用于局部变量的修饰符当 static 用于修饰局部变量时,通常是在某个函数体内,只能在该函数内被调用。这样定义的变量通常被称为局部静态变量,它的值不会因为函数调用的结束而被清除,当函数再次被调用时,它的值是上一次调用结束后的值。如下面这段代码所示,变量 x 是...

weixin_39977776的博客 2307

c语言static用法总结

c语言static用法总结 一、c程序存储空间布局 C程序一直由下列部分组成: 1.正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令; 2.初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。 3.非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。 4.栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。 5.堆——动态存储分。 |-----.

huang714的专栏 1485

C语言-static用法

C语言-static用法

hmh520i的博客 9750

c语言static用法

/ 静态全局变量static void internalFunc() { // 静态函数// 静态局部变量calls++;demo();demo();return 0;输出。

shuigege1111的博客 539

static关键字在C语言中的3种用法

static关键字在C语言中的3中用法

川子767的博客 2700

C语言初阶-C语言static用法

目录 前言 1.static的定义 2.static修饰局部变量 2.static修饰全局变量 3.static修饰函数 总结: 前言 哈喽,大家好,我是大鹏,目前是一名大二的学生,今天给大家带来的是static用法,希望大家给个关注和赞,有错误大佬还请指出,谢谢大家的喜欢! 1.static的定义 static代表静态的,被static修饰的全局变量、局部变量、函数都会存放在静态中,在此附上图片 在内存里有三个区,被static修饰的则被放在静态区这个位置 2...

qq_53283658的博客 3万+

C语言关键字static用法详解

概述 本文就static在c语言中的应用进行总结,供参考使用。错漏之处,请不吝指正。 在程序中使用static 先给大家看一个程序。 #include<stdio.h> void fun() { int a = 1; a++; printf("%d ", a); } int main() { int i = 0; while (i < 10) { fun(); i++; } return 0; } 这段代码的执行结果是: 原因:主函数中fun函数被调用十次,由

qq_52208569的博客 827

c语言中的static和extern,C语言extern与static用法,及extern “c"

C语言extern与static用法,及extern "c "一、c语言static与extern的用法1.static和extern:大工程下我们会碰到很多源文件。文件a.cstatic int i; //只在a文件中用int j; //在工程里用static void init() //只在a文件中用{}void callme() //在工程中用{static int sum;}上面的全局i...

weixin_31031155的博客 1732

static用法(C语言

探讨static用法及其原理。

qq_61499350的博客 2213

C语言static关键字的用法

static关键字在c语言中主要有两种用法: 1修饰局部变量 unsigned char test(); int main() { for (size_t i = 0; i < 20; i++) { printf("%d\n", test()); } getchar(); } unsigned char test() { static unsigned...

qq_40686435的博客 1508

c语言static三种用法

c语言学习:static的三种用法

2301_78261635的博客 2663
上一篇: C++的类与C里面的struct的区别
下一篇: C++类型转换
ssff1
博客等级 码龄21年 23粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值