首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C 语言内存四区原理 ( 内存四区建立流程 )

文章目录 一、内存四区建立流程 一、内存四区建立流程 ---- 内存四区 建立流程 : 1....加载代码到内存 : 操作系统 中 执行 可执行程序 , 将 存放在硬盘中的 可执行程序 ( 包含代码 ) 加载到内存中 , 这里的代码指的是 ELF 文件中汇编代码对应的机器码 ; 2....将 C 代码在内存中分区 : 操作系统 将 C 代码 分为 4 个区 , 由上到下 : 堆区 , 栈区 , 全局区 , 代码区 ; 堆区 : 开发者负责分配释放内存 , 调用 malloc / new...函数分配内存 , 调用 free / delete 函数释放内存 , 如果程序结束还没有释放内存 , 则 由操作系统回收内存 ; 栈区 : 由 编译器 自动 分配 与 释放 , 存放函数 参数 , 局部变量值

1.3K30

C语言内存模型

内存四区 1栈区 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等 2.堆区 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 3.静态全局数据区 主要包括静态全局区和常量区...用于存储程序编译连接后生成的二进制机器码指令的内存区域 区别 能否产生碎片 对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。...生长方向不同 对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方式是向下的,是向着内存地址减小的方向增长。...堆则是c/c++库函数提供的,机制很复杂。库函数会按照一定的算法进行分配。显然,堆的效率比栈要低得多。...------stack------- 28ff3c 28ff14 28ff10 28ff0c 28fef0 28fef4 28fef0 28fef4 ------heap------- 4629f0 462a00

1.7K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    程序内存四区模型建立

    内存四区建立 流程说明: 1、操作系统把物理硬盘代码load到内存 2、操作系统把c代码分成四个区 3、操作系统找到main函数入口执行 各区元素分 函数调用模型 文字说明:...函数的返回地址入栈, 将fa函数的参数入栈, 将fa函数的运行状态入栈, 里面有fb函数, 将fb函数的返回地址入栈 将fb函数的参数入栈 然后逆序出栈 内存四区模型和函数调用模型变量传递分析...1、一个主程序有n函数组成,c++编译器会建立有几个堆区?...2、函数嵌套调用时,实参地址传给形参后,C++编译器如何管理变量的生命周期? 分析:函数A,调用函数B,通过参数传递的变量(内存空间能用吗?) 那么 fa申请的内存,可以被main使用吗?...64个字节,给return出来,而是把内存块的首地址(例如内存的标号0xaa11) ,返回给 tmp // 理解指针的关键,是内存.

    67820

    C 语言内存四区原理 ( 栈内存属性增长方向 | 栈内存开口方向 | 代码示例 )

    文章目录 一、栈内存开口方向 二、栈内存开口方向代码示例 一、栈内存开口方向 ---- 栈内存的生长方向 : 先后定义两个变量 int a , b; 开口向上 : b 的地址 > a 的地址 , a 放在下面..., b 放在上面 ; 开头向下 : b 的地址 < a 的地址 , a 放在上面 , b 放在下面 ; 注意 : 不管 栈内存 开口向上 , 还是开口向下 , 栈内存中 数组的地址 + 1 , 永远是向上的..., 按照地址增长方向由低地址到高地址向上 ; 栈内存中的内存空间标号 , 编译时确定 ; 二、栈内存开口方向代码示例 ---- 根据 栈的 后进先出 的特性 , 可以使用代码测试该 栈内存的 生长方向...= %d , &b = %d\n", &a, &b); return 0; } 执行结果 : &a = 6422220 , &b = 6422216 上述代码 , 在不同的系统平台中 , 栈内存的增长方向不同

    64810

    C++】面向对象模型 ② ( C++ 类对象的内存存储方式 | C 语言内存四区回顾 | C++ 类对象内存结构 | C++ 编译器将 C++ 类 转为 C 语言代码 分析 )

    一、C++ 类对象的内存存储方式 1、C 语言内存四区回顾 操作系统 将 C 代码 分为 4 个区 , 由上到下 : 堆区 , 栈区 , 全局区 , 代码区 ; 堆区 : 开发者负责分配释放内存 ,...+ 类对象内存结构 C++ 类对象内存结构 : C++ 类 实例对象 中的 成员变量 和 成员函数 在内存中是分开存储的 ; 成员变量 : 普通成员变量 : 在 对象 指针指向的内存中存储 , 存储方式与...C 语言中的 struct 结构体 存储变量的 内存结布局 和 字节对齐方式 相同 ; 静态成员变量 : 在 内存 中的 全局数据区 中存储 ; 成员函数 : 不管是 普通成员函数 还是 静态成员函数..., 都存储在 代码段 中 ; C++ 面向对象 的底层 , 也是通过 C 语言实现的 ; 3、C++ 编译器将 C++ 类 转为 C 语言代码 分析 C++ 编译器 将 C++ 类 的 成员变量 和...语言函数 ; 参数个数 : 将 C++ 类成员函数 转为 C 语言函数 后 , 对应的 C 语言函数 的第一个参数必须是 指定的类型指针参数 , 也就是说 , 假如 C++ 类成员函数有 n 个参数

    75751

    C 语言内存四区原理 ( 栈内存与堆内存对比示例 | 函数返回的堆内存指针 | 函数返回的栈内存指针 )

    文章目录 一、函数返回的堆内存指针 二、函数返回的栈内存指针 一、函数返回的堆内存指针 ---- 在 main 主函数中 , 调用 get_memory 子函数 , 返回 malloc 初始化的堆内存..., 可以 正常 使用指针 操作该 堆内存 ; 代码示例 : #include #include /* 该方法获取一块内存地址 */ char *get_memory...(int memory_size) { // 声明指针, 用于接收分配内存地址 // 该变量是在栈内存中 char *p = NULL; // 堆内存分配一块内存...// 这块内存不会因为 get_memory 函数执行完毕导致释放 p = (char *)malloc(sizeof(char) * memory_size); // 如果内存分配失败...char *p = NULL; // 获取内存地址 , 获取的是堆内存的地址 // 该堆内存是在 get_memory 函数中进行分配的 p = get_memory(

    67410

    C语言----C语言内存函数

    (void * destination, const void * source,size_t num); //因为内存拷贝拷贝的数据有:整型数据、结构体数据、结构体数据。...,非要使用,结果就是未定义的 //只负责不重叠的内存 函数的返回值是void*类型的数据 这个memcpy函数有三个数据 2.memmove--内存移动--使用和模拟实现 2.memmove--内存移动...//总之:这个拷贝是分三块区域的,最前面的一块区域满足dest<src //我们只能从前往后进行拷贝,不然会出错误 //而剩下的两块区域可以同时从后往前进行拷贝,那么我们就将这两块区域放在一起 在C语言标准中...3.memset--内存设置--函数的使用 memset是用来设置内存的,将内存中的值以字节单位设置为想要的内容 基本格式: void memset (void ptr,int value,size_t...--函数的使用 4.memcmp--内存比较--函数的使用 内存的比较 什么类型的都能进行比较 int main() { int arr1[] = { 1,2,3,4,5 }; int

    10910

    内存四区,malloc,内存操作注意事项

    内存四区 ? 注意内存小于4个字节,会放入寄存器上 malloc函数 ? 注意:在堆区开辟内存的时候,内存就已经随机赋值了,因此可以用memset清空内存 ?...内存操作注意事项 1.不要返回局部变量的地址 vs编译器会先保留一次局部变量地址,防止程序员误操作 内存已经被释放,再操作属于非法行为 注意返回地址用指针接收,与返回值用变量接收的区别: 指针接收地址...2.不要操作已经释放的内存空间 不能再释放后*p=2000;再次操作释放的内存空间 ?...3.不要重复释放一块内存 free释放的不是指针,而释放的指针指向的内存空间。free之后,如果指针又指向了另一块内存空间,可以直接使用该内存空间的数据。...而如果free之后指针没有指向其他内存空间,也没有指向NULL,依旧指向着已被释放的内存空间,所以操作数据会出错。一般在free之后都需要重新指向新的内存空间或NULL ?

    90320

    C语言内存函数

    source, size_t num ); 这个函数有点类似于上篇博客的strncpy,但是strncpy只能拷贝字符串的,而咱们现在遇到的函数是memcpy,这个没有具体拷贝什么,它的功能就是将一个内存块里的数据拷贝到另一个内存块...注意: • 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。...void * memmove ( void * destination, const void * source, size_t num ); 这个函数其实只跟memcpy有一个差别,这个函数源内存块和目标内存块是可以重叠的...,而memcpy不能重叠 注意: • 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。...\n", buffer1, buffer2); return 0; } 结束语 这篇博客内存函数要和上一篇博客字符串函数区分清楚,可以对比区分一下 OK感谢观看

    6710

    C++ 内存模型

    本文是《C++ 并发编程》一文的姊妹篇。将着重介绍C++11标准引入的内存模型。 前言 在《C++ 并发编程》一文中,我们已经介绍了C++11到C++17在并发编程方面的新增API。...关于C++内存模型 2004年,Java 5.0引入了适用于多线程环境的内存模型[2]:JSR-133[3]。但C++直到2011标准才引入了内存模型。...之所以这么做是因为C++是一门系统编程语言,它的设计意图之一就是:不需要另外一个更底层的语言,而是直接提供给开发者以”接近机器“的方式编程。...Relaxed:松散模型。 这其中,后两种只有C++内存模型中提供,其他编程语言例如Java或者C#中均没有。 考虑到这三个术语目前尚未有一致的翻译,因此下文我们还是用英文来表达它们。...C++作为一个跨平台的编程语言,也提供了相应机制。

    2.3K52

    C++】动态内存管理 ① ( C 语言中的动态内存管理 | C 语言 内存申请 | C 语言 内存释放 | 代码示例 )

    一、动态内存管理 动态内存管理由 内存的申请 内存的释放 构成 , 这里的内存指的是 堆内存 , 与之相对的是 栈内存 ; 在 程序运行时 过程中 , 经常 根据需要 进行动态内存管理 , 从而更加灵活地管理内存资源..., 包括 : 分配 堆内存 中的 内存空间 释放 堆内存 中的 内存空间 C 语言C++ 语言 中 , 都有 动态 分配 / 释放 堆内存 的方法 ; C 语言中 , 主要是 堆内存的 分配 与...释放 ; C++ 语言中 , 主要是 对象的动态建立和释放 ; 二、C 语言中的动态内存管理 1、C 语言 内存申请 在 C 语言中 , 使用malloc()、calloc()、realloc() 等标准库函数来动态地申请内存..., 需要导入 stdlib.h 头文件 ; #include 2、C 语言 内存释放 在 C 语言中 , 调用 free() 标准库函数 释放已申请的内存 ; 3、代码示例...- C 语言动态内存管理 在下面的代码中 , 首先 , 使用 malloc() 函数 动态地申请了 可以存放 5 个 int 数据的 堆内存 , // 函数原型 : void *malloc(unsigned

    38030

    C语言内存函数

    ✨作者:@平凡的人1 ✨专栏:《C语言从0到1》 ✨一句话:凡是过往,皆为序章 ✨说明: 过去无可挽回, 未来可以改变 ---- 从这篇开始,我们开始学习C语言内存函数——memcpy、memmove...void * destination, const void * source, size_t num ); 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置...结果是不是也是一样的❓ 居然成功了,难道是我们说错了❓不是哦,对于memcpy——只要实现了不重叠拷贝就可以了,在VS中的实现既可以拷贝不重叠,也可以拷贝重叠内存!!!!在其他平台就不一定了!!...对于重叠内存的拷贝,我们需要介绍memmove memmove void * memmove ( void* destination, const void * source, size_t...num ); 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。

    88120

    C语言内存管理

    据调查80%的程序崩溃都是内存的管理出现问题,有时候表面没有问题,运行一段时间后问题就爆发了,所以对内存的管理非常重要,这里和大家一起总结讨论下C/C++中关于内存管理的一些要点。...栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 (3)从堆上分配,亦称动态内存分配。...class Object {private:void* data;const int size;const char id;public: Object(int sz, char c):size(...sz), id(c){ data = new char[size];cout << "Object() " << id << " size = " << size << endl; }...【规则4】动态<em>内存</em>的申请与释放必须配对,防止<em>内存</em>泄漏。 【规则5】用free或delete释放了<em>内存</em>之后,立即将指针设置为NULL,防止产生“野指针”。 更多案例可以go公众号:<em>C</em><em>语言</em>入门到精通

    1.6K2319

    C语言内存函数

    内存函数 memcpy 需要头文件:#include void* memcpy( void* destination, const void* source, size_t num...); ·函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置 ·这个函数遇到'\0'时不会停下来 ·如果source和destination有任何重叠...string.h> void* memmove( void* destination, const void* source, size_t num );  ·和memcpy的差别就是memmove函数处理的原内存块和目标内存块是可以重叠的...return 0; } memset 需要头文件:#include void* memset( void* ptr, int value, size_t num ); ·此函数用来设置内存...,将内存中的值以字节为单位设置成想要的内容 ·第一个参数是被设置的对象的首地址,第二个参数是输入你想设置的内容,第三个参数是内容设置几个字节 使用 #include #include

    5010

    C语言内存函数)

    1、memcpy 的使用和模拟实现 1.1 memcpy 函数的使用 memcpy 前面的 mem 指的是 memmory ,英文单词“记忆”,在C语言中指的是内存。...memcpy 是一个内存拷贝函数,其作用是将一个内存区域内指定的 count 个字节大小的内容拷贝到目标内存空间内。...上面我们是将一个内存区域的内容拷贝到另一个内存区域,那能不能实现在一个内存区域内的拷贝呢?...不过只要内存不重叠,在一个内存区域内拷贝也是可行的。 但是,我们可以看到 memcpy 函数并没有这个问题,那是我们模拟的函数有问题吗?...以上所有的函数都是可以操作内存的函数,与前面介绍的字符、字符串函数不同的是内存函数可以操作任意类型的内容。

    6010

    c语言内存函数

    ⽬标内存块是可以重叠的,我们下面举个例子就好理解了。...memcmp函数返回一个整数值,表示比较结果: 如果两个内存区域的前n个字节完全相同,则返回0。...如果从第一个字节开始比较,s1指向的内存区域小于(大于)s2指向的内存区域,则返回一个小于(大于)零的值。...具体来说,memcmp首先将s1指向的内存区域的第一个字节的值减去s2指向的内存区域的第一个字节的值,若差值为0,则继续比较下一个字节,直到比较完n个字节或遇到不相等的字节为止。...因此,memcmp不仅可以用于比较字符串,还可以用于比较任意类型的内存区域,只要这些内存区域的内容是可以按字节进行比较的。

    5310
    领券