当前位置:首页 » 存储配置 » 编程变量存储空间

编程变量存储空间

发布时间: 2023-09-13 20:38:33

A. c语言编程常见问题解答之变量和数据存储

第2章 变量和数据存储

C语言的强大功能之一是可以灵活地定义数据的存储方式。C语言从两个方面控制变量的性质:作用域(scope)和生存期(lifetime)。作用域是指可以存取变量的代码范围,生存期是指可以存取变量的时间范围。
作明告用域有三种:
1. extern(外部的) 这是在函数外部定义的变量的缺省存储方式。extern变量的作用域是整个程序。
2.static(静态的) 在函数外部说明为static的变量的作用域为从档毕定义点到该文件尾部;在函数内部说明为static的变量的作用域为从定义点到该局部程序块尾部。
3.auto(自动的) 这是在函数内部说明的变量的缺省存储方式。auto变量的作用域为从定义点到该局部程序块尾部。
变量的生存期也有三种,但它们不象作用域那样有预定义的关键字名称。第一种是extern和static变量的生存期,它从main()函数被调用之前开始,到程序退出时为止。第二种是函数参数和auto变量的生存期,它从函数调用时开始,到函数返回时为止。第三种是动态分配的数据的生存期,它从程序调用malloc()或calloc()为数据分配存储空间时开始,到程序调用free()或程序退出时为止。
2.1 变量存储在内存(memory)中的什么地方?
变量可以存储在内存中的不同地方,这依赖于它们的生存期。在函数外部定义的变量(全局变量或静态外部变量)和在函数内部定义的static变量,其生存期就是程序运行的全过程,这些变量被存储在数据段(datasegment)中。数据段是在内存中为这些变量留出的一段大小固定的空间,它分为两部分,一部分用来存放初始化变量,另一部分用来存放未初始化变量。
在函数内部定义的auto变量(没有用关键字static定义的变量)的生存期从程序开始执行其所在的程序块代码时开始,到程序离开该程序块时为止。作为函数参数的变量只在调用该函数期间存在。这些变量被存储在栈(stack)中。栈是内存中的一段空间,开始很小,以后逐渐自动增大,直到达到某个预定义的界限。在象DOS这样的没有虚拟内存(virtual memory)的系统中,这个界限由系统决定,并且通常非常大,因此程序员不必担心用尽栈空间。关于虚拟内存 的讨论,请参见2.3。
第三种(也是最后一种)内存空间实际上并不存储变量,但是可以用来存储变量所指向的数据。如果把调用malloc()函数的结果赋行槐芹给一个指针变量,那么这个指针变量将包含一块动态分配的内存的地址,这块内存位于一段名为“堆(heap)”的内存空间中。堆开始时也很小,但当程序员调用malloc()或calloc()等内存分配函数时它就会增大。堆可以和数据段或栈共用一个内存段(memorysegment),也可以有它自己的内存段,这完全取决于编译选项和操作系统。
与栈相似,堆也有一个增长界限,并且决定这个界限的规则与栈相同。

请参见:
1.1 什么是局部程序块(10calblock)?
2.2 变量必须初始化吗?
2.3 什么是页抖动(pagethrashing)?
7.20 什么是栈(stack)?
7.21 什么是堆(heap)7 .
2.2 变量必须初始化吗?
不。使用变量之前应该给变量一个值,一个好的编译程序将帮助你发现那些还没有被给定一个值就被使用的变量。不过,变量不一定需要初始化。在函数外部定义的变量或者在函数内部用static关键字定义的变量(被定义在数据段中的那些变量,见2.1)在没有明确地被程序初始化之前都已被系统初始化为0了。在函数内部或程序块内部定义的不带static关键字的变量都是自动变量,如果你没有明确地初始化这些变量,它们就会具有未定义值。如果你没有初始化一个自动变量,在使用它之前你就必须保证先给它赋值。
调用malloc()函数从堆中分配到的空间也包含未定义的数据,因此在使用它之前必须先进行初始化,但调用calloc()函数分配到的空间在分配时就已经被初始化为0了。
请参见:
1.1 什么是局部程序块(10calblock)?
7.20 什么是栈(stack)?
7.21 什么是堆(heap)?
2.3 什么是页抖动(pagethrashing)?
有些操作系统(如UNIX和增强模式下的Windows)使用虚拟内存,这是一种使机器的作业地址空间大于实际内存的技术,它是通过用磁盘空间模拟RAM(random—access memory)来实现的。

B. 程序的局部变量 全局变量 动态申请数据分别存储在什么地方

程序的局部变量全局变量动态申请数据分别存储在栈里。

普通局部变量在堆栈空间上分配,当局部变量的函数被多次调用时,局部变量每次在堆栈上的位置都不相同。还可以在堆上动态分配局部变量(malloc),但是要记住在耗尽堆空间后释放zd。

内存分配上的栈空间时要注意内存的,不能分配太多的内存。如果堆栈中的空间小于请求的空间大小,则系统将显示堆栈溢出并给出相应的异常信息。但堆不同,堆可分配空间很大。

(2)编程变量存储空间扩展阅读:

注意事项:

对局部变量进行分类

1.位置:编译器将静态局部变量放在全局存储区域中。数据,因此尽管它是本地的,但它存在于程序的整个生命周期中(它在定义时产生,并随着程序的结束而结束)。

2.访问权限:静态局部变量只能由其作用域内的变量或函数访问。也就是说,尽管它将存在于程序的整个生命周期中,但是其他函数和源文件不能访问它,因为它是静态的。

3.值:如果用户没有初始化静态局部变量,编译器会自动将其赋值为0,每次调用静态局部变量时都会使用最后一次调用后的值。

C. C语言中 局部变量和全局变量都是存储在什么区

C语言中局部变量存在栈里,全局变量存静态存储区。

局部变量在栈空间上分配,这个局部变量所在的函数被多次调用时,每次调用这个局部变量在栈上的位置都不一定相同。局部变量也可以在堆上动态分配,但是记得使用完这个堆空间后要释放之。

全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放;

(3)编程变量存储空间扩展阅读

C语言中局部变量和全局变量示例:

#include<stdio.h>

#include<malloc.h>

staticints1=0,s2=0,s3=0;//静态变量放在静态区

intg1=0,g2=0,g3=0;//全局变量放在静态区

voidmain()

{

staticints4=0,s5=0,s6=0;<spanstyle="font-family:Arial,Helvetica,simsun,u5b8bu4f53;"></span>//静态变量

inta1=0,a2=0,a3=0;<spanstyle="font-family:Arial,Helvetica,simsun,u5b8bu4f53;"></span>//局部变量放在栈区

charc1[]="aabb";//局部变量放在栈区

char*c2="aabb";//字符常量放在静态区

char*m1=(char*)malloc(1);//堆区

char*m2=(char*)malloc(1);//堆区

char*m3=(char*)malloc(1);//堆区

printf("动态数据区 ");

printf("a1 a2 a3 ",&a1,&a2,&a3);

printf("c1 ",c1);

printf("m1 m2 m3 ",&m1,&m2,&m3);

printf("静态数据区 ");

printf("s1 s2 s3 ",&s1,&s2,&s3);

printf("g1 g2 g3 ",&g1,&g2,&g3);

printf("s4 s5 s6 ",&s4,&s5,&s6);

printf("c2 ",c2);

}

D. C语言中全局变量存放在内存空间中那个位置

在 C 语言中,内存分配方式有以下三种形式:

1、从静态存储区域分配
由编译器自动分配和释放,在程序编译的时候就已经分配好内存,这块内存在程序的整个运行期间都存在,直到整个程序运行结束时才被释放,如全局变量与 static 变量。

2、在栈上分配
同样由编译器自动分配和释放,在函数执行时,函数内部的局部变量都可以在栈上创建,函数执行结束时,这些存储单元将则被自动释放。

需要注意的是,栈内存分配运算内置于处理器的指令集中,它的运行效率一般很高,但是分配的内存容量有限。

3、从堆上分配
也称为动态内存分配,由程序员手动完成申请和释放。程序在运行的时,由程序员使用内存分配函数(如 malloc 函数)来申请内存,使用完之后再由程序员自己负责使用内存释放函数(如 free 函数)来释放内存。

需要注意的是,如果在堆上分配了内存空间,就必须及时释放它,否则将会导致运行的程序出现内存泄漏等错误。

在 C 语言中,不同类型变量的存储位置和作用域也有所不同。

全局变量
从静态存储区域分配,其作用域是全局作用域,也就是整个程序的生命周期内都可以使用。如果程序是由多个源文件构成的,那么全局变量只要在一个文件中定义,就可以在其他所有的文件中使用,但必须在其他文件中通过使用extern关键字来声明该全局变量。

全局静态变量
从静态存储区域分配,其生命周期也是与整个程序同在的,从程序开始到结束一直起作用。与全局变量不同的是,全局静态变量作用域只在定义它的一个源文件内,其他源文件不能使用。

局部变量
从栈上分配,其作用域只是在局部函数内,在定义该变量的函数内,只要出了该函数,该局部变量就不再起作用,也即该变量的生命周期和该函数同在。

局部静态变量
从静态存储区域分配,其在第一次初始化后就一直存在直到程序结束。该变量的特点是其作用域只在定义它的函数内可见,出了该函数就不可见了。

E. c语言中编译系统和操作系统谁为变量分配相应的存储空间

编译系统将程序编译成可皮敬卜执行代码

操作系统执行程序,按照可执行代码需求为程序燃穗分配代码空间、常量空间、变量空间稿含、堆栈空间,然后执行程序。

热点内容
安卓和ios步数哪个准确 发布:2025-01-24 13:12:13 浏览:289
怎么给电脑换配置 发布:2025-01-24 13:04:04 浏览:919
如何修改服务密码10086 发布:2025-01-24 12:44:27 浏览:512
dosftp连接 发布:2025-01-24 12:35:56 浏览:802
编程来炒股 发布:2025-01-24 12:35:14 浏览:854
python正则中括号 发布:2025-01-24 12:32:08 浏览:584
配置排列用英语怎么说 发布:2025-01-24 12:32:00 浏览:607
led流水灯c语言程序 发布:2025-01-24 12:28:15 浏览:46
苹果平板锁屏密码在哪里 发布:2025-01-24 12:16:41 浏览:958
网校c语言 发布:2025-01-24 12:12:15 浏览:787