当前位置:首页 » 编程软件 » 静态变量在编译时分配内存

静态变量在编译时分配内存

发布时间: 2022-05-31 20:11:41

1. C语言问题:内存的分配方式有哪几种

1、静态存储区分配

内存分配在程序编译之前完成,且在程序的整个运行期间都存在,例如全局变量、静态变量等。

2、栈上分配

在函数执行时,函数内的局部变量的存储单元在栈上创建,函数执行结束时这些存储单元自动释放。

3、堆上分配

堆分配(又称动态内存分配)。程序在运行时用malloc或者new申请内存,程序员自己用free或者delete释放,动态内存的生存期由我们自己决定。

(1)静态变量在编译时分配内存扩展阅读

栈上分配数组

#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(" ");

}

}

2. (C语言)编译时给全局变量和静态变量分配存储空间,运行时给局部变量分配存储空间,这样说对吗

全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间

全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

3. c++编译系统在编译时对静态存储变量分配存储单元吗

是啊,就是在编译的时候分配的么,不过你也可以动态分配,比如malloc函数,这样的内存是在堆中申请的,所以程序执行的时候才会申请,一般的变量什么的,包括数组都是在栈中存放,堆就是要靠用户管理的数据区域,栈则是有系统自动管理的。

4. C++静态数据成员是在编译时分配空间,那普通数据成员是在什么时候分配内存空间,是在运行时吗

静态变量是在编译时分配的,程序结束时才释放
动态变量是在运行时动态分配的,根据你定义的位置确定,比如你在一个函数中定义的,那么超出该函数范围变量将被释放

5. 我们经常看到书上面说的 某某变量的内存单元是编译器在编译时候分配的 是什么意思

所谓在编译期间分配空间指的是静态分配空间(相对于用new动态申请空间),如全局变量或静态变量(包括一些复杂类型的常量),它们所需要的空间大小可以

明确计算出来,并且不会再改变,因此它们可以直接存放在可执行文件的特定的节里(而且包含初始化的值),程序运行时也是直接将这个节加载到特定的段中,不
必在程序运行期间用额外的代码来产生这些变量。
其实在运行期间再看“变量”这个概念就不再具备编译期间那么多的属性了(诸如名称,类型,作用
域,生存期等等),对应的只是一块内存(只有首址和大小),
所以在运行期间动态申请的空间,是需要额外的代码维护,以确保不同变量不会混用内存。比如写new表示有一块内存已经被占用了,其它变量就不能再用它了;
写delete表示这块内存自由了,可以被其它变量使用了。(通常我们都是通过变量来使用内存的,就编码而言变量是给内存块起了个名字,用以区分彼此)
内存申请和释放时机很重要,过早会丢失数据,过迟会耗费内存。特定情况下编译器可以帮我们完成这项复杂的工作(增加额外的代码维护内存空间,实
现申请和释 放)。从这个意义上讲,局部自动变量也是由编译器负责分配空间的。进一步讲,内存管理用到了我们常常挂在嘴边的堆和栈这两种数据结构。
最后对于“编译器分配空间”这种不严谨的说法,你可以理解成编译期间它为你规划好了这些变量的内存使用方案,这个方案写到可执行文件里面了(该文件中包含若干并非出自你大脑衍生的代码),直到程序运行时才真正拿出来执行。

6. 静态变量是在编译时分配内存空间,编译时是什么时候编译时都做什么东西啊

静态变量在编译时进行初始化,运行阶段分配内存空间。静态变量在整个程序生命周期都是存在的。

7. 静态变量在内存哪分配的

内存不止分为堆和栈,还有另外3个区:
|-----------|
|     栈     |
|-----------|
|      |      |
|     \|/     |
|             |
|     /|\     |
|      |      |
|-----------|
|     堆     |
|-----------|
| 未初始化|
|------------|
|    初始化 |
|------------|
|   正文段 |
|------------|
其中栈是由编译器自动分配释放,堆区是程序员申请释放;
全局变量和静态变量是存储的一起的,全局未初始化变量和静态未初始化变量放在未初始化区(又称BSS区),全局初始化变量和静态初始化变量放在初始化区;
代码的二进制存放在正文段。。

8. 编译器编译高级语言为低级语言的时候,给全局变量或静态变量是如何分配内存的

对于C和C++的编译器,全局变量和静态变量都是在专门的数据区保存的,更具体一点,一般是在.data和.bss段保存的,具体在哪个段,编译器会根据代码中是否对这些变量进行了初始化来决定,如果初始化过,并且初始化的值不为0,那么这个这个变量一般就会被放在编译结果的.data段中,否则就是放在.bss段中。
.data段中就保存变量的符号,还保存变量的初始化值,而在.bss段中,只保存变量的符号,而不保存值,这是因为这部分的变量都将被初始化为0,这也是为什么static声明的变量即使没有初始化也会是0的原因。
这些段都会在程序被执行的时候由操作系统(或链接器)加载到指定的内存中,便完成相应的初始化。

9. C++中局部静态变量是在什么时刻产生(分配内存)在编译时,还是等运行到该变量的首次出现时

局部static 变量在程序运行的时候分配空间了,只不过作用域是局部的,生存期和全局变量一样到程序结束

热点内容
java返回this 发布:2025-10-20 08:28:16 浏览:646
制作脚本网站 发布:2025-10-20 08:17:34 浏览:938
python中的init方法 发布:2025-10-20 08:17:33 浏览:633
图案密码什么意思 发布:2025-10-20 08:16:56 浏览:822
怎么清理微信视频缓存 发布:2025-10-20 08:12:37 浏览:733
c语言编译器怎么看执行过程 发布:2025-10-20 08:00:32 浏览:1068
邮箱如何填写发信服务器 发布:2025-10-20 07:45:27 浏览:301
shell脚本入门案例 发布:2025-10-20 07:44:45 浏览:162
怎么上传照片浏览上传 发布:2025-10-20 07:44:03 浏览:854
python股票数据获取 发布:2025-10-20 07:39:44 浏览:764