c语言中的存储类型有auto, extern, register, static 这四种,存储类型说明了该变量要在进程的哪一个段中分配内存空间,可以为变量分配内存存储空间的有数据区、BBS区、栈区、堆区。
1. auto存储类型
auto只能用来标识局部变量的存储类型,对于局部变量,auto是默认的存储类型,不需要显示的指定。因此,auto标识的变量存储在栈区中。
2. extern存储类型
extern用来声明在当前文件中引用在当前项目中的其它文件中定义的全局变量。如果全局变量未被初始化,那么将被存在BBS区中,且在编译时,自动将其值赋值为0,如果已经被初始化,那么就被存在数据区中。全局变量,不管是否被初始化,其生命周期都是整个程序运行过程中,为了节省内存空间,在当前文件中使用extern来声明其它文件中定义的全局变量时,就不会再为其分配内存空间。
3. register存储类型
声明为register的变量在由内存调入到CPU寄存器后,则常驻在CPU的寄存器中,因此访问register变量将在很大程度上提高效率,因为省去了变量由内存调入到寄存器过程中的好几个指令周期。
4. static存储类型
被声明为静态类型的变量,无论是全局的还是局部的,都存储在数据区中,其生命周期为整个程序,如果是静态局部变量,其作用域为一对{}内,如果是静态全局变量,其作用域为当前文件。静态变量如果没有被初始化,则自动初始化为0。静态变量只能够初始化一次。
B. C语言问题:内存的分配方式有哪几种
1、静态存储区分配
内存分配在程序编译之前完成,且在程序的整个运行期间都存在,例如全局变量、静态变量等。
2、栈上分配
在函数执行时,函数内的局部变量的存储单元在栈上创建,函数执行结束时这些存储单元自动释放。
3、堆上分配
堆分配(又称动态内存分配)。程序在运行时用malloc或者new申请内存,程序员自己用free或者delete释放,动态内存的生存期由我们自己决定。
(2)c语言静态存储区扩展阅读
栈上分配数组
#include<iostream>
usingnamespacestd;
voidmain()
{
int**arr=NULL;//int型二维数组
introws,columns;
cin>>rows;//2
cin>>columns;//3
//请在此处编写代码,根据rows和columns在栈上分配一个数组arr
...你的代码...
//赋值给数组元素
for(introwIndex=0;rowIndex<rows;rowIndex++)
{
for(intcolumnIndex=0;columnIndex<columns;columnIndex++)
{
arr[rowIndex][columnIndex]=columnIndex+(rowIndex+1)*1000+1;
}
}
//打印每个数组元素
for(rowIndex=0;rowIndex<rows;rowIndex++)
{
for(intcolumnIndex=0;columnIndex<columns;columnIndex++)
{
printf("%d",arr[rowIndex][columnIndex]);
}
printf(" ");
}
}
C. c++全局/静态存储区和常量存储区是一样的吗
当然不一样,下面详细讲解一下内存分配的几个区:
栈:
就是那些由编译器在需要的时候分配,
在不需要的时候自动清除的变量的存储区。
里面的变量通常是局部变量、函数参数等。
在一个进程中,位于用户虚拟地址空间顶部
的是用户栈,编译器用它来实现函数的调用。
和堆一样,用户栈在程序执行期间可以动态地扩展和收缩。
堆:
就是那些由new分配的内存块,他们的释放编译器不去管,
由我们的应用程序去控制,一般一个new就要对应一个delete。
如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
堆可以动态地扩展和收缩。
自由存储区,
就是那些由malloc等分配的内存块,他和堆是十分相似的,
不过它是用free来结束自己的生命的。
全局/静态存储区,
全局变量和静态变量被分配到同一块内存中,
在以前的C语言中,全局变量又分为初始化的
和未初始化的(初始化的全局变量和静态变量在一块区域,
未初始化的全局变量与静态变量在相邻的另一块区域,
同时未被初始化的对象存储区可以通过void*来访问和操纵,
程序结束后由系统自行释放),在C++里面没有这个区分了,
他们共同占用同一块内存区。
常量存储区,
这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改
D. C语言中变量的存储类型有哪几种,存储方式哪几种谢喽
在C语言中,对变量的存储类型说明有以下四种:
1、auto 自动变量
2、register 寄存器变量
3、extern 外部变量
4、static 静态变量
所谓存储类型是指变量占用内存空间的方式,也称为存储方式。
变量的存储方式可分为“静态存储”和“动态存储”两种。
1、静态存储变量通常是在变量定义时就在存储单元并一直保持不变,直至整个程序结束。
2、动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放。典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配,调用函数完毕立即释放。
如果一个函数被多次调用,则反复地分配、释放形参变量的存储单元。从以上分析可知,静态存储变量是一直存在的,而动态存储变量则时而存在时而消失。
(4)c语言静态存储区扩展阅读:
变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。
一、从作用域看:
1、全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量的定义的源文件需要用extern关键字再次声明这个全局变量。
2、静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束一直存在,它和全局变量的区别在于全局变量对所有函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。
3、局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。
4、静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它文件里,不能作用到其他文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。
二、从分配空间看:
全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间。
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一个源程序的其他源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其他源文件中引起错误。
1、静态变量会放在程序的静态数据存储区(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
2、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。
参考资料来源:网络-变量-存储类型
E. 在C语言中,什么是动态存储,什么是静态存储
动态存储是auto关键字,例如我们定义的int
a;
默认就是动态存储,具体应该是
auto
int
a;一般是用于函数参数,局部变量,超出作用域范围会失效,变量产生在动态存储区
静态存储时static关键字,例如,我们定义一个
static
int
a;
就是存储在静态存储区,相当于一个全局变量
一楼的理解出现了问题
F. C语言中 局部变量和全局变量都是存储在什么区
C语言中局部变量存在栈里,全局变量存静态存储区。
局部变量在栈空间上分配,这个局部变量所在的函数被多次调用时,每次调用这个局部变量在栈上的位置都不一定相同。局部变量也可以在堆上动态分配,但是记得使用完这个堆空间后要释放之。
全局变量全部存放在静态存储区,在程序开始执行时给全局变量分配存储区,程序行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不动态地进行分配和释放;
(6)c语言静态存储区扩展阅读
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);
}
G. c语言中全局变量都是静态储存的吗
不太严格的说,可以这么认为。
因为全局变量和静态变量在内存里是储存在一个地方的。叫
data
segment
(数据段),静态区。意思是这个地方的数据的生命周期是不变的,只要程序本身在运行,他们就会存在。所以说他们都存在同一片区域内。
你能想到
静态变量
和
全局变量
在使用的时候有什么区别吗?唯一的区别就是对于多个文件的访问权限,static
的变量只对本文件有效,而全局变量(除去const)对当前所有文件有效。main.cpp
可以访问
foo.cpp
的全局变量,而不能访问
foo.cpp
的静态变量。
既然他们存在一个地方,如何区分呢。通过变量的
linkage
(即能否被链接器识别)属性,internal
linkage
的变量只能被本文件访问,而
external
linkage
的变量可以被其他文件访问。就这个层面而言,你的想法不能说有错。
H. C语言动态和静态存储类别的区别
主要区别在于存储区域和作用时间。
C语言的数据区分为静态存储区与动态存储区。
静态存储是指在程序运行期间给变量分配固定存储空间的方式。如全局变量存放在静态存储区中,程序运行时分配空间,程序运行完释放。
动态存储是指在程序运行时根据实际需要动态分配存储空间的方式。如形式参数存放在动态存储区中,在函数调用时分配空间,调用完成释放。
I. C语言指针申明的变量都存储在静态区吗
首先在C语言中,所有的字符串(注意不是数组字符串),都属于静态储存类别的,也就是C规定字符串必须为存放在静态栈。
你用指针str指向了"helloworld"的地址,所以str也是指导了静态栈之中,如果你用数组来声明字符串就不会是这个样子了。
char str[ ]="helloworld":表示首先在静态栈创建"helloworld",然后再把静态栈的字符串字面量(就是字符串的内容)拷贝到str数组之中;
你用 p指向了整数10的地址,指针是存放在动态栈中的,一旦遇到{号就被清空了,直到下一次被调用
J. C语言中全局变量的储存类别是
C语言中全局变量的储存类别是静态存储区。
由某对象或某个函数所创建的变量通常都是局部变量,只能被内部引用,而无法被其它对象或函数引用。
全局变量既可以是某对象函数创建,也可以是在本程序任何地方创建。全局变量是可以被本程序所有对象或函数引用。
(10)c语言静态存储区扩展阅读:
使用全局变量会占用更多的内存(因为其生命期长),不过在计算机配置很高的今天,这个不应该算什么问题,除非使用的是巨大对象的全局变量,能避免就一定要避免。
使用全局变量程序运行时速度更快一些(因为内存不需要再分配),同样也快不了多少。对于局部变量的名字空间污染,这个在不使用太多变量时是可以避免的。
当全局变量与局部变量重名的时候,起作用的是局部变量,全局变量被屏蔽掉。还可以用extern在函数外对全局变量声明,使全局变量的作用域从声明处到文件的结束。