1. C语言变量生命周期问题设计数组越界
C语言不检查数组越界和指针,这个程序员负责的事情,编译时只检查语法有没有错误。
而且并不是一越界就异常的,异常可能会在将来发生,或者这次越界没有破坏关键数据。
你要先打印数据,再增加global,否则就会输出下一个值,但是你却没有赋值
2. C语言中如何定义全局变量
1、首先,我们可以在函数外面定义变量,就是全局变量。
3. C语言动态变量和静态变量的区别
一、形式不同:
静态变量是在定义的时候,有static 修饰的变量,形式为static TYPE var_name = init_value;
动态变量,形式为TYPE var_name = init_value;即没有static 修饰,其中的=init_value均可省略。
二、作用不同:
动态全局变量:作用域为整个项目,即最终编译成可执行文件的所有文件中均可以使用动态全局变量,生命周期为从程序运行到程序退出,即贯穿整个运行时间。
静态全局变量:作用域为当前文件,从定义/声明位置到文件结尾,生命周期为从程序运行到程序退出,即贯穿整个运行时间。
常量使用
静态变量也可以用于存储常数。具体来说,静态变量(全局变量及汇编语言里定义的符号亦同)可用const,constant或final(根据语言决定)等关键字标识,这时其值就会在编译时设定,并且无法在运行时改变。
编译器通常将静态常量与文本一起置于目标文件的文本区域,而非常量初始化数据则置于数据区;而如若有需要,有些编译器还可选择为其开辟专用区;为防止常数变量被错误的指针写入覆盖,亦可在这块区域启用内存保护机制。
以上内容参考:网络-静态变量
4. C里面静态动态,生命周期.作用域怎么区分怎么用
原创内容:
静态static.简单来说就是一个可以在普通函数中定义,却能够向后起全局变量作用的东西。一般的定义变量都会默认为auto动态的,在其作用域内有效,栈上分配的变量会因为作用域的结束而被释放掉内存。而静态的不会,即使它的程序块已经执行完毕了,但是它依然存在,知道程序结束。
如:
{
int i=0;
.......
}
到这里这个i就已经没有意义了
你在此时引用i就出错了。
如果声明为静态变量就不会出错了。
生命周期应该就是其存在的周期把。
作用域简单来说就是指你声明了一个变量,你可以引用并使用它的范围。
全局变量的作用域是所有函数,你在所有函数中都可以调用它。
普通函数中定义的变量就在函数中有效,不仅仅是函数。如:
void xx()
{
int a;
for(int i=0;i<10;i++)
{
//.,..............
}
}
这里的a和i的作用域都不一样。
a在xx函数内都有效,而i只在for循环中起作用。
所以按照最新的规则,我们在一个函数中定义两个for循环,控制循环变量我们可以取相同的名字。如:
void xx()
{
for(int i=0;i<10;i++)
{
//循环1
}
for(int i=0;i<100;i++)
//循环2
}
如果没有作用域的区分,那么这样就已经算是重定义了。
而事实上这是合法的。
5. c++ 变量的生命周期和内存的分配释放
一般情况下,C语言的存储数据内存分好几种:
全局区
常量区
堆区
栈区
全局变量,是全局可见,程序结束后由操作系统收回。
常量区,全局存在,程序结束后由操作系统收回。
堆区,全局存在,程序员主动申请,主动释放,如果不释放,导致内存不足,于一个常驻进程内存泄漏,导致程序异常,无法继续申请内存,当程序结束后,此部分内存由操作系统收回。
栈区,局部存在,系统分配,作用周期在两个花括号之间,进入花括号,操作系统会在栈中开辟一些空间,esp指针减少,称为入栈,当退出花括号,系统会释放分配的栈之内存,esp指针增加,恢复到入花括号之前的状态,称之为出栈。
举例:
#include <stdio.h>
int gv;
int main()
{
const char * cvchar="hello";
static int mvar = 15;
int a,b;
{
int x = 2;
char * p = (char *)malloc(15);
printf("%s");
free(p);
}
}
分析:
gv,mvar:全局区,但是,gv的作用域为程序可见,mvar是main函数内可见;
a,b:栈区,main函数可见,出了main函数,生命周期和作用域结束,所占内存在main结束后被收回。
x,p:栈区,main函数里的花括号可见。出了花括号,x,p的作用域和生命周期均已结束,所占内存被回收。
p指向的内存:堆区,通过malloc分配了15个字节的内存,在free之前或者程序结束前一直可用。
p本身占用了4个指节的内存,在出花括号后这4个字节被回收,但是通过malloc分配的内存并没有被回收,回收仅仅是p而已。
建议多看看,操作系统与编译器相关知识。
6. 怎么理解C语言中常量的生命周期和作用范围
生命周期要理解数据在内存中如何变化 全局变量在程序运行完后才释放而局部变量 在用完后立马释放;
作用范围就是其作用的范围 全局变量整个程序都可以调用 而局部变量只能在某个函数中才起作用其他函数无法调用
7. c++变量生命周期的问题
VC6.0中间类似使用2次
for(int i....)
第二次使用的时候会报错i重复定义
所以把int i定义在for语句外面,也就是定义成main函数的局部变量就没事了
这样还有个好处是和C语法相同,移植到C编译器上也没有问题
8. 关于c++的变量 内存分配与释放 生命期
就你的例子说一下。局部变量a的生命周期在执行完fun();时的确完了,<生命周期结束是说你在下面不能通过变量a去访问那个内存位置了,和作用域比起来生命周期是运行时候的,作用域是静态的,生命周期是动态的>,其他关于内存是否被回收,其值是否不改变你都不知道。但在这里那个位置仍然在栈上面,仍可以通过其他方式访问,比如你用指针p去保留了那个内存位置,而且这时只能说p是野指针,因为在压栈以及出栈的过程中那个位置的值随时都可能变化,这样也很危险,你可能不小心通过p修改了栈上面的数据,通过p去破坏堆栈,程序会出现各种异常,也许还会崩溃。如下,在你的实验下加入下面的函数fun2,再在调用完fun后调用fun2,你会发现p指向的值被修改了,因为fun2占用了那段栈空间来完成调用。如果你懂汇编,下面代码反汇编后就可以清楚地看见堆栈上的变化
int *p = 0;
void fun()
{
{
int a = 2;
p = &a;
}
}
void fun2()
{
int b=3;//这样效果也许更好,因为这样和fun值的a的位置是同一个堆栈位置
return;
}
void main()
{
fun();
fun2();
cout<<*p<<endl;
}
9. 关于C中for循环内定义的变量的生命周期
在c语言中,变量通常要求局部变量在函数最开始声明,否则会被编译器报错,这种变量的声明周期只限于在函数体内。
像你提出的这种,可以无视刚才的要求,在函数内部任意位置声明变量,他的声明周期就是for循环内部,每次进入都是新的变量,占用栈上空间。
我有一个小窍门,方便记忆,{}内部的变量,声明周期只在当前{}内。
比如:
{
int a;
int b;
}
可以这样声明变量,甚至不需要任何循环体,或者if,这些变量一旦离开当前{},就被销毁
10. C语言中变量的存储类型有哪几种,存储方式哪几种谢喽
在C语言中,对变量的存储类型说明有以下四种:
1、auto 自动变量
2、register 寄存器变量
3、extern 外部变量
4、static 静态变量
所谓存储类型是指变量占用内存空间的方式,也称为存储方式。
变量的存储方式可分为“静态存储”和“动态存储”两种。
1、静态存储变量通常是在变量定义时就在存储单元并一直保持不变,直至整个程序结束。
2、动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放。典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配,调用函数完毕立即释放。
如果一个函数被多次调用,则反复地分配、释放形参变量的存储单元。从以上分析可知,静态存储变量是一直存在的,而动态存储变量则时而存在时而消失。
(10)c编译器变量生命周期扩展阅读:
变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。
一、从作用域看:
1、全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量的定义的源文件需要用extern关键字再次声明这个全局变量。
2、静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束一直存在,它和全局变量的区别在于全局变量对所有函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。
3、局部变量也只有局部作用域,它是自动对象(auto),它在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用执行结束后,变量被撤销,其所占用的内存也被收回。
4、静态全局变量也具有全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它文件里,不能作用到其他文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。
二、从分配空间看:
全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间。
全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一个源程序的其他源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其他源文件中引起错误。
1、静态变量会放在程序的静态数据存储区(全局可见)中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
2、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。
参考资料来源:网络-变量-存储类型