`

c++变量在内存中的存储区域

    博客分类:
  • C++
阅读更多
01 #include <iostream>
02
03 #include <string>
04 using namespace std;
05 int a = 0; // Initialization Area of Overall
06 char *p1; // Not Initialization Area of Overall
07
08 void main()
09 {
10 int b; // stack
11 char s[] = "abc"; // stack
12 char *p2; // stack
13 char *p3 = "123456"; // p3 in stack
14 static int c =0; // Initialization Area of Static Overall
15 p1 = new char[10];
16 p2 = new char[20];
17 strcpy(p1, "123456");
18 cout<<p1;
19 delete [] p1;
20 delete [] p2;
21 }
程序说明:
(1) 第5~6 行分别在函数体外部定义了两个变量a 和p1,它们存储在内存的静态存储区域。
(2) 第10~13 行定义的变量b、s、p2、p3 为局部变量,存储在内存的堆栈区。
(3) 第14 行定义的变量c 为静态局部变量,存储在内存的静态存储区域。
(4) 第17 行使用strcpy 函数,将字符串“123456”复制给指针变量p1 指向的存储单元。第18 行的输出结果为“123456”。
知识点:
(1) 当编译一个C++程序时,计算机的内存被分成了4 个区域:程序代码区、全局变量区、堆栈区和堆区。堆是自由的内存区域,可以通过new 和delete 把对象放在此区域,并可以在任何地方分配和释放自由存储区。
(2) C++中的变量可以分为全局变量、静态全局变量、静态局部变量和局部变量。其中,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。
① 局部静态变量。在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
内存中的位置:静态存储区。
初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非被显式初始化)。
作用域:作用域指变量的有效范围,当定义它的函数或者语句块结束时,作用域随之结束。
注意:当static 用来修饰局部变量时,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存中,直到程序结束,只不过不能再对它进行操作了。
② 全局静态变量。在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)。
初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非被显式初始化)。
作用域:全局静态变量在声明它的文件之外是不可见的,准确地讲,是从定义处开始到文件结尾。
注意:当static 用来修饰全局变量时,它就改变了全局变量的作用域(在声明它的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区。
③ 静态函数。在函数的返回类型前加上关键字static,该函数就被定义成为静态函数。
函数的定义和声明默认情况下是 extern 的,但静态函数只在声明它的文件中可见,不能被其他文件所用。
④ 静态数据成员。
内存中的位置:静态存储区。
初始化和定义:
静态数据成员定义时要分配空间,不能在类声明中定义。
静态数据成员在程序中只能提供一个定义。静态数据成员的初始化不能在类的头文件中。
访问:
类实例名.静态数据成员
类类型名::静态数据成员
说明:
static 数据成员和普通数据成员一样遵循public,protected,private 访问规则。
对于非静态数据成员,每个类实例都有自己的备份。静态数据成员被当做类的全局对象,无论这个类的对象被定义了多少个,静态数据成员在程序中也只有一个备份,由该类类型的所有对象共享访问。
同全局对象相比,使用静态数据成员有两个优势:
静态数据成员没有进入程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能性。
静态数据成员可以实现信息隐藏。静态成员可以是 private 成员,而全局对象不可以。
静态数据成员的唯一性本质(独立于类的任何对象而存在的唯一实例),使它能够以独特的方式被使用,这些方式对于非static数据成员来说是非法的。
⑤ 静态成员函数。在类的成员函数返回值之前加上关键字static,它就被声明为一个静态成员函数。静态成员函数不能声明为const 或volatile,这与非静态成员函数不同。
定义:出现在类体外的函数定义不能指定关键字static。
作用域:主要用于对静态数据成员的操作。
静态成员函数与类相联系,不与类的对象相联系。
静态成员函数不能访问非静态数据成员,因为非静态数据成员属于特定的类实例。
静态成员函数没有this指针,因此在静态成员函数中隐式或显式地引用这个指针都将导致编译时刻错误。试图访问隐式引用this指针的非静态数据成员也会导致编译时刻错误。
访问:可以用成员访问操作符(.)和箭头(->)为一个类实例或指向类实例的指针调用静态成
员函数,也可以用限定修饰符名直接访问或调用静态成员函数,而无需声明类实例
分享到:
评论

相关推荐

    c/c++变量在内存中的分配

    C/C++变量在内存中的分配 C/C++变量在内存中的分布是一个非常重要的基础知识点,在笔试中经常考到,虽然简单,但也容易忘记。因此,我们需要加深对C/C++变量在内存中的分布的理解。 首先,需要了解C/C++变量在内存...

    C++中类使用全局变量

    4. **内存管理**:全局变量占用静态存储区域,它们在程序执行期间一直存在,直到程序结束。 5. **数据安全**:全局变量可以被程序任何部分修改,这可能导致数据不一致和难以调试的问题。如果可能,应优先考虑使用...

    C++中的内存划分

    本文将基于“C++中的内存划分”这一主题,深入解析C++中内存的不同区域及其分配方式,帮助读者更好地理解C++内存管理机制。 ### 1. 堆内存与栈内存 C++中的内存主要分为两大类:堆内存和栈内存。栈内存由编译器...

    c_c++中内存区域划分大总结

    ### C/C++中内存区域划分大总结 在C/C++编程语言中,了解不同内存区域的划分对于理解和管理程序中的内存至关重要。本文将详细介绍C/C++中的四种主要内存区域:栈、堆、全局区(静态区)以及常量区,并通过示例代码...

    C/C++程序内存的各种变量存储区域和各个区域详解

    C语言在内存中一共分为如下几个区域,分别是: 1.内存栈区:存放局部变量名; 2.内存堆区:存放new或者malloc出来的对象; 3.常数区:存放局部变量或者全局变量的值; 4.静态区:用于存放全局变量或者静态变量; 5....

    c++内存搜索学习

    在C++编程中,内存搜索是一项重要的技能,尤其是在调试、性能优化或者逆向工程中。本文将深入探讨C++内存搜索的学习,包括基础知识、搜索方法以及相关实践。 首先,了解C++内存管理的基础是必要的。C++允许程序员...

    C++各变量的区别

    3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放。 4、...

    浅析C/C++变量在内存中的分布

    4. **全局静态区**:未初始化或初始化为零的全局变量和静态变量存储在这里。初始化的全局变量和静态变量也放在此区,但它们的存储空间是分开的。 5. **常量数据区**:常量字符串、符号表等常量数据存储在这个区域。...

    c++实现内存搜索源代码(和CE差不多)

    - **内存模型**:理解C++中的内存布局,包括栈、堆和静态存储区域,这对于内存搜索至关重要。 - **进程和内存空间**:每个程序运行时都是一个独立的进程,有自己的虚拟内存空间。 - **指针操作**:C++中的指针是...

    关于C++中char型变量的地址输出

    在C/C++中,每个变量都存储在一个特定的内存位置。当我们使用`&`运算符获取变量的地址时,实际上是在获取该变量在内存中的确切位置。对于`char`型变量而言,它的地址可以被解释为指向单个字符的指针,而不仅仅是字符...

    程序变量存储位置

    在程序运行期间,不同类型的变量会被存储在内存的不同区域: - **静态类型变量(`static`)**:GCC编译器会在`.data`或`.bss`节中为静态类型的变量分配空间,并在`.symtab`节中为其创建具有唯一名称的本地链接器...

    C和C++内存划分总结

    初始化的全局变量和静态变量存储在一个区域,未初始化的则存储在相邻的另一个区域。这部分内存会在程序结束时由系统自动释放。 4. **常量区**:专门存放不可更改的常量,如字符串常量。这部分内存同样在程序结束时...

    Windows内存管理机制及C++内存分配

    3. **静态内存**:静态变量或全局变量存储在数据段,由编译器在程序开始时分配,在程序结束时释放。它们在整个程序运行期间保持不变。 4. **常量内存**:常量在编译时分配,存储在只读数据段,不能被修改。 5. **...

    c++ 内存空间游戏

    这款游戏通过互动体验,让学习者能够在实践中理解堆栈、堆、静态存储区以及常量存储区等不同内存区域的特性。 在C++中,内存分为四个主要区域: 1. **栈区(Stack)**:这是程序运行时由编译器自动分配和释放的...

    用c++编写的内存修改器

    - C++中的指针:理解指针如何存储和解引用内存地址,以及如何通过指针遍历数据结构。 - 指针运算:了解指针加减运算,以及如何通过指针访问数组或结构体成员。 5. **异常处理**: - 在进行内存操作时,可能遇到...

    c++内存到底分几个区

    栈是C++中一种非常重要的内存区域,用于存储函数调用过程中的局部变量、函数参数等信息。其特点是先进后出(Last In First Out,LIFO),这意味着最后进入栈的数据会最先被弹出。当函数执行完毕返回时,相应的栈空间...

    C++内存分配详解

    全局变量和静态变量存储在此区域,包括初始化的全局变量、静态变量以及未初始化的全局变量和静态变量。初始化的全局变量和静态变量存储在一起,未初始化的则单独存储。全局变量在整个程序运行期间一直存在,直到程序...

    C++ 内存管理算法和实现

    C++中的内存分为堆(Heap)和栈(Stack)两个主要区域。栈内存用于存储局部变量和函数调用信息,由编译器自动管理,生命周期短且分配速度快;堆内存则是程序员通过`new`和`delete`手动管理,分配速度慢但内存大小可...

    C++内存管理,如何防止内存泄漏

    C++内存分为三种主要区域:栈(Stack)、堆(Heap)和静态存储区(Static Storage)。栈内存用于存储局部变量和函数调用时的参数,由编译器自动管理;堆内存用于动态分配,程序员需通过`new`和`delete`操作来控制;...

Global site tag (gtag.js) - Google Analytics