C语言中static定义的变量 存储在OS内存的啥区域?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中static定义的变量 存储在OS内存的啥区域?相关的知识,希望对你有一定的参考价值。

windows下,进程虚拟地址4G,0~2G属于进程私有,
进程私有地址布局是:
两端各有64k空间,以防指针值为空,
地址从低往高是代码段、数据段、栈、堆,

static变量在数据段,具体是_DATA段,该段数据都已初始化
参考技术A 硬盘的虚拟地址上的,地址是固定的.

C语言基础:存储类(autoregisterstaticextern)

1. 存储类

存储类定义 C 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出 C 程序中可用的存储类:

  • auto 是局部变量的默认存储类, 限定变量只能在函数内部使用;
  • register 代表了寄存器变量,不在内存(RAM)中使用;
  • static 是全局变量的默认存储类,表示变量在程序生命周期内可见;
  • extern 表示全局变量,即对程序内所有文件可见,类似于Java中的public关键字;

1.1 auto存储类

auto 存储类是所有局部变量默认的存储类。

上面的实例定义了两个带有相同存储类的变量,auto 只能用在函数内,即 auto 只能修饰局部变量。


   int mount;
   // 等同于上面
   auto int month;


1.2 register存储类

register 存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个字),且不能对它应用一元的 ‘&’ 运算符(因为它没有内存位置)。


   register int  miles;

寄存器只用于需要快速访问的变量,比如计数器。还应注意的是,定义 ‘register’ 并不意味着变量将被存储在寄存器中,它意味着变量可能存储在寄存器中,这取决于硬件和实现的限制。


1.3 static存储类

static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数调用之间保持局部变量的值。

static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。

全局声明的一个 static 变量或方法可以被任何函数或方法调用,只要这些方法出现在跟 static 变量或方法同一个文件中。

以下实例演示了 static 修饰全局变量和局部变量的应用:

#include <stdio.h>
 
/* 函数声明 */
void func1(void);
 
static int count=10;        /* 全局变量 - static 是默认的 */
 
int main()

  while (count--) 
      func1();
  
  return 0;

 
void func1(void)

/* 'thingy' 是 'func1' 的局部变量 - 只初始化一次
 * 每次调用函数 'func1' 'thingy' 值不会被重置。
 */                
  static int thingy=5;
  thingy++;
  printf(" thingy 为 %d , count 为 %d\\n", thingy, count);

实例中 count 作为全局变量可以在函数内使用,thingy 使用 static 修饰后,不会在每次调用时重置。

运行结果:


1.4 extern存储类

extern 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。当您使用 extern 时,对于无法初始化的变量,会把变量名指向一个之前定义过的存储位置。

当您有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时,可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。可以这么理解,extern 是用来在另一个文件中声明一个全局变量或函数。

extern 修饰符通常用于当有两个或多个文件共享相同的全局变量或函数的时候,如下所示:


addtwonum.c

#include <stdio.h>
/*外部变量声明*/
extern int x ;
extern int y ;
int addtwonum()

    return x+y;

test.c

#include <stdio.h>
  
/*定义两个全局变量*/
int x=1;
int y=2;
int addtwonum();
int main(void)

    int result;
    result = addtwonum();
    printf("result 结果为: %d\\n",result);
    return 0;

test.c运行结果:



以上是关于C语言中static定义的变量 存储在OS内存的啥区域?的主要内容,如果未能解决你的问题,请参考以下文章

参数变量存储在内存中的啥位置?

static在c语言中是啥意思?

c语言中的变量总结

c语言—变量

常量变量存储在 C 中的啥位置?

C语言中都有哪些存储类型?