宿迁网站建设多少钱,做网站好还是网页好,网站建设 优惠,襄阳seo站内优化Linux系统下C程序的虚拟内存模型。 1.程序代码段存储内容生命周期初始化时机特点代码演示 2.只读初始化数据段存储内容生命周期初始化时机特点代码演示 3.读写初始化数据段存储内容生命周期初始化时机特点代码演示 4. 堆区#xff08;Heap#xff09;存储内容生命周期初始化时… Linux系统下C程序的虚拟内存模型。 1.程序代码段存储内容生命周期初始化时机特点代码演示 2.只读初始化数据段存储内容生命周期初始化时机特点代码演示 3.读写初始化数据段存储内容生命周期初始化时机特点代码演示 4. 堆区Heap存储内容生命周期初始化时机特点代码演示 5. 栈区Stack存储内容生命周期初始化时机特点代码演示 6.命令行参数存储内容生命周期初始化时机特点代码演示 7.环境变量存储内容生命周期初始化时机特点代码演示 在Linux系统下一个C程序运行时的内存布局是从低地址到高地址组织的。下面是各个内存区域的详细说明包括它们存储的信息以及这些信息的生命周期 1.程序代码段
存储内容
存储CPU能够执行的程序的机器指令。包括程序的自定义函数和库函数包括静态库和动态库编译后的机器代码。静态库编译时整合到可执行文件。动态库Linux 下的 .so 文件Windwos 下的 .dll 文件程序运行时被加载到内存。
生命周期
开始程序代码段的内容开始执行。 结束程序代码段的内容执行结束。
初始化时机
不涉及。
特点
程序运行时代码段只读。
代码演示
不涉及。
2.只读初始化数据段
存储内容
编译时已知且运行时不需要修改的数据。 const char * 指针指向的字符串。 const 修饰的全局或命名空间作用域内的基本数据类型变量。
生命周期
开始程序开始执行时。 结束程序执行结束后由操作系统回收。
初始化时机
程序启动时完成main函数执行之前。
特点
只读初始化数据段通常被操作系统设置为只读。这意味着任何试图修改这一区域的数据的操作都将导致运行时错误例如违反访问权限的错误。
代码演示
#include iostream// GREETING_MESSAGE为字符串常量将被存储在只读数据段
//Hello, world!为字符串常量将被存储在只读数据段
const char* const GREETING_MESSAGE Hello, world!;// DAYS_IN_WEEK为只读的全局常量也会被放置在只读数据段
const int DAYS_IN_WEEK 7;int main() {// 打印存储在只读数据段的字符串常量std::cout GREETING_MESSAGE std::endl;// 打印存储在只读数据段的全局常量std::cout There are DAYS_IN_WEEK days in a week. std::endl;return 0;
}3.读写初始化数据段
存储内容
存储在程序编译时已经初始化的全局变量。 静态变量C类的静态成员变量函数的静态变量。
生命周期
开始程序开始执行时。 结束程序执行结束后由操作系统回收。
初始化时机
全局变量在程序启动时main函数执行之前。 类的静态成员变量在程序启动时main函数执行之前。 函数内的静态变量只会在第一次调用函数时初始化。
特点
这些变量可以在程序运行时被修改。
代码演示
#include iostream// 全局变量已初始化会被存储在读写初始化数据段
int globalCounter 0;// 类的静态成员变量也存储在读写初始化数据段
class Example {
public:static int staticMember;
};
int Example::staticMember 1;void incrementCounter() {// 函数内的静态变量只会在第一次调用函数时初始化存储在读写初始化数据段static int counter 0;counter;std::cout Counter: counter std::endl;
}int main() {// 打印全局变量和静态成员变量的初始值std::cout Global counter: globalCounter std::endl;std::cout Static member: Example::staticMember std::endl;// 修改全局变量和静态成员变量的值globalCounter;Example::staticMember;// 打印修改后的值std::cout Global counter: globalCounter std::endl;std::cout Static member: Example::staticMember std::endl;return 0;
}4. 堆区Heap
存储内容
动态内存分配的对象。
生命周期
开始通过动态内存分配函数如C中的 new 或C中的 malloc 创建。 结束通过对应的内存释放函数如C中的 delete 或C中的 free 显式释放。
初始化时机
初始化时机取决于具体的分配和初始化方式。 使用new操作符的时候可以同时进行分配和初始化。 使用malloc等C语言风格的内存分配时分配和初始化是分开的初始化需要显式进行。
特点
堆向高地址增长即“向上”增长。
代码演示
#include iostreamclass Sample {
public:int value;Sample(int v) : value(v) {} // 构造函数void display() { std::cout Value: value std::endl; }
};int main() {// 在堆上动态分配一个Sample对象Sample* samplePtr new Sample(10); // 分配并初始化// 使用对象samplePtr-display(); // 显示 Value: 10// 释放分配的内存delete samplePtr; // 结束对象的生命周期return 0;
}5. 栈区Stack
存储内容
局部变量。 函数参数。 返回地址。 控制流信息等。
生命周期
开始当声明一个局部变量或进入一个函数时。 结束当离开变量的作用域或函数返回时。
初始化时机
局部变量在声明时可以进行初始化。 函数参数在函数调用时通过传递实参来初始化。
特点
栈通常向低地址增长即“向下”增长。
代码演示
#include iostreamvoid function() {int localVar 5; // 局部变量的声明和初始化std::cout Local variable in function: localVar std::endl;// 离开函数时localVar的生命周期结束
}int main() {function(); // 调用functionlocalVar在这里开始生命周期// 在这里function中的localVar不再存在已经被自动销毁return 0;
}6.命令行参数
存储内容
argcArgument Count: 一个整数表示传递给程序的命令行参数数量包括程序名本身。
argvArgument Vector: 一个字符串数组存储具体的参数值。argv[0]是程序名argv[1]至argv[argc-1]是用户传递给程序的参数。
生命周期
开始程序启动时操作系统准备命令行参数。 结束程序终止时命令行参数的生命周期结束。
初始化时机
命令行参数在程序启动之前由操作系统解析和准备然后在程序的main函数启动时通过argc和argv参数传递给程序。
特点
命令行参数是在程序启动时由操作系统传递给程序的参数这些参数允许用户指定程序运行时的行为或输入。在C和C中这些参数通过main函数的参数接收通常是两个参数argc参数计数和argv参数向量。
代码演示
#include iostreamint main(int argc, char *argv[]) {std::cout You have entered argc arguments: std::endl;for(int i 0; i argc; i) {std::cout argv[i] std::endl;}return 0;
}这个程序会输出用户输入的所有命令行参数包括程序名本身。假设程序名为program并且运行时输入了两个额外的参数arg1 arg2那么输出将会是
You have entered 3 arguments:
program
arg1
arg27.环境变量
存储内容
键值对形式的字符串其中键是变量名值是设置的值。
生命周期
开始在计算机启动或用户登录时由操作系统初始化。 结束在计算机关闭或用户登出时结束。
初始化时机
环境变量在程序启动前由操作系统初始化对所有的程序和进程都是可见的。
特点
环境变量是操作系统中用于存储系统级或用户级配置信息的全局变量。它们由操作系统或用户设置并在程序启动前就已经存在。
代码演示
#include iostream
#include cstdlib // 提供getenvint main() {// 获取名为PATH的环境变量const char* path getenv(PATH);if (path ! nullptr) {std::cout PATH: path std::endl;} else {std::cout PATH environment variable does not exist. std::endl;}return 0;
}这段代码中getenv函数尝试获取名为PATH的环境变量的值。如果该环境变量存在它会返回指向相应值的指针如果不存在返回nullptr。
环境变量对程序是只读的尽管程序可以修改自己的环境变量副本但这些修改不会影响到其他程序或操作系统级别的设置。