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

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

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

1.2K30

C 语言内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储 | 内存布局 | 野指针 )

C语言中避免指针错误的编程规范 ( 1 ) 申请内存后先判空 ( 2 ) 避免数组越界 注意数组长度 ( 3 ) 动态内存 谁申请 谁释放 ( 4 ) 释放后立即置NULL 一....1.C语言操作与内存关系密切 : C 语言中的所有操作都与内存相关 ; 2.内存别名 : 变量 ( 指针变量 | 普通变量 ) 和 数组 都是在 内存中的别名 ; ( 1 ) 分配内存的时机...总结 程序内存总结 : 1.静态存储 : .bss 段 和 .data 段 是静态存储 ; 2.只读存储 : .rodata 段存放常量, 是只读存储 ; 3.栈内存 : 局部变量存放在栈内存中...; 4.野指针不可判定 : 目前 C 语言中 无法判断 指针 是否 为野指针 ; ---- ( 2 ) 野指针的三大来源 野指针来源 : 1.局部变量指针未初始化 : 局部指针变量, 定以后, 没有进行初始化...C语言中避免指针错误的编程规范 ( 1 ) 申请内存后先判空 申请空间后先判断 : 使用 malloc 申请内存之后, 先检查返回值是否为 NULL, 防止使用 NULL 指针, 防止对 0 地址进行操作

1.5K40
您找到你想要的搜索结果了吗?
是的
没有找到

C 语言】文件操作 ( C 语言中的文件操作函数 | 磁盘与内存缓冲 | 缓冲工作机制 )

文章目录 一、C 语言中的文件操作函数 二、磁盘与内存缓冲 三、缓冲工作机制 一、C 语言中的文件操作函数 ---- 读取 文本文件 可以使用 getc , fgets , fscanf 函数 ,...---- 上述所有读写文件的函数 , 都是缓冲函数 , 即 C 语言中的文件操作 , 都是缓冲函数 ; 磁盘 是由 操作系统 进行读写的 , 用户写的程序 , 不能直接操作磁盘 ; 操作系统 提供...中 , 维护了一个缓冲 , 这个缓冲内存 中的缓冲 ; 使用 C 语言文件操作函数 读写的 数据 , 不是直接来自磁盘 , 而是来自 内存中缓冲 ; 三、缓冲工作机制 ---- 缓冲工作机制...: 如果 缓冲大小 64KB , 假如使用 C 语言库函数 fread 读取一个字节数据 , 实际上会从磁盘文件中读取 64KB 数据 , 放入内存缓冲中 ; 这是因为 读写内存的效率 远远高于...读写磁盘的效率 ; 这样的好处是 , 读取第 2 个字节时 , 可以直接从内存中读取 , 不需要再次读写磁盘 ; 该机制可以 增加用户程序的执行效率 , 减少磁盘访问次数 ; 磁盘读写寿命 , 读写次数到了

81210

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 上述代码 , 在不同的系统平台中 , 栈内存的增长方向不同

55310

C语言共享内存

参考资料: 共享内存 linux进程间的通信(C): 共享内存 共享内存特点 共享内存是进程间共享数据最快的方法 一个进程向共享内存写入数据,共享这个内存区域的所有进程就可以立即看到其中的内容。...使用共享内存需要注意的是多进程之间对一个给定存储访问的互斥 若一个进程正在向共享写数据,则在它操作完成之前,其他的进程不应当去读、写这些数据。...示例代码如下 memShareWrite.c // // IPC--共享内存(写数据) // Created by 卢鹏 on 2017/8/31. // #include #include...shmadd, msg); printf("copy data to shared-memory success, with msg: %s\n", msg); } memShareRead.c...-o w ➜ gcc memShareRead.c -o w ➜ chmod +x w ➜ chmod +x r ➜ ➜ ➜ .

4K20

C语言内存管理

据调查80%的程序崩溃都是内存的管理出现问题,有时候表面没有问题,运行一段时间后问题就爆发了,所以对内存的管理非常重要,这里和大家一起总结讨论下C/C++中关于内存管理的一些要点。...2 内存分配方式 内存分配方式三种: (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 (2)在栈上创建。...~Object(){cout << "~Object() " << id << endl;delete []data; }}; 以上代码会在堆疯狂的动态分配内存空间,导致系统内存耗尽时自动调用set_new_handler...(5)释放了内存却继续使用它。 三种情况: (1)程序中的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存,此时应该重新设计数据结构,从根本上解决对象管理的混乱局面。...【规则4】动态内存的申请与释放必须配对,防止内存泄漏。 【规则5】用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。 更多案例可以go公众号:C语言入门到精通

1.6K2319

C语言内存函数

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

83320

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

25730

c语言内存开辟

动态内存函数 在堆申请的空间,动态开辟的空间不要忘了释放 malloc 参数是无符号的整型,表示的是多少字节数。当参数为0时,这是标准没有定义的。取决于编译器。 返回类型为void*的指针。...开辟完成之后都要判断一下有没有成功 例: c#include #include #include int main() { char...两种情况: 1. 以前动态开辟的空间后面的空间够再次开辟,那么realloc直接在以前开辟的后面进行开辟。 2....常见的动态内存错误 对NULL指针的解引用操作 这里的p万一是空指针,下面这种就是错误 c char* p = (char*)malloc(10 * sizeof(char)); *p = 1;...free(p); 对同一块动态内存多次释放 c char* p = (char*)malloc(10 * sizeof(char)); if (p == NULL) { printf("%s\n

47720

C语言内存模型

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

1.6K30

C语言 | C++内存对齐

C语言允许你干预“内存对齐”。如果你想了解更加底层的秘密,“内存对齐”对你就不应该再模糊了。...的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行; //2020.05.12 公众号:C语言与...CPP编程 #include struct { int i; char c1; char c2; }Test1; struct{ char c1;...根据上面的分析,不难得出上面例子三个结构体的内存布局如下: 例子三个结构体的内存布局 更改C编译器的缺省字节对齐方式: 在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。...6; } 对于位域的定义,以下几点说明: (1)一个位域必须存储在同一个字节中,不能跨两个字节。

3.4K89

C语言缓冲溢出详解

wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1] 1 引言 “缓冲溢出”对现代操作系统与编译器来讲已经不是什么大问题,但是作为一个合格的 C/C++ 程序员...计算机程序一般都会使用到一些内存,这些内存或是程序内部使用,或是存放用户的输入数据,这样的内存一般称作缓冲。...2 C/C++中内存分配 任何一个源程序通常都包括静态的代码段(或者称为文本段)和静态的数据段,为了运行程序,操作系统首先负责为其创建进程,并在进程的虚拟地址空间中为其代码段和数据段建立映射。...堆是程序员自己分配,速度较慢,容易产生碎片,不过用起来方便。...','5','6','7','8',’\0’}; //或者 char array[11]={'0','1','2','3','4','5','6','7','8','9’}; 更多案例可以go公众号:C语言入门到精通

2.3K2219

C语言】getchar()函数缓冲

目录 前言 gethcar()函数的介绍 缓冲 结束语 ---- ---- ✨专栏:《C语言从0到1》 ✨送给各位的一句话:种一棵树最好的时间是十年前,其次是现在 ✨说明:无论如何,当我们下定决心的时候...---- 前言 大家好啊,由于之前有关C语言的博客写的比较少,不够详细,加之较少的时间写博客,但是我会尽己所能,把每一篇博客写好,帮助自己复习的同时,我也希望能够帮助到大家,让我们一起努力学习吧。...接下去,我会陆续更新并且完善关于专栏《C语言从0到1》这个系列,如果大家有需要的,一起学习的,记得点赞关注加收藏哦!...下面,来说说缓冲问题✈️ 缓冲 我们还是来看看这一串代码: 图片 getchar()是直接从键盘读取字符吗?不是,与键盘之间一个缓冲,输入缓冲。...所以,我们可以知道getchar()可以用来清理缓冲 知道了这些,getchar()到底什么用呢?

1.1K30

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(

62710

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

一、C++ 类对象的内存存储方式 1、C 语言内存回顾 操作系统 将 C 代码 分为 4 个 , 由上到下 : 堆 , 栈 , 全局 , 代码 ; 堆 : 开发者负责分配释放内存 ,...; 程序执行结束后由操作系统释放 ; 常量 : 存放 字符串常量 和 其它常量 , 程序结束后由 操作系统释放 ; 代码 : 存放 函数的 二进制代码 ; 2、C++ 类对象内存结构 C++ 类对象内存结构...: C++ 类 实例对象 中的 成员变量 和 成员函数 在内存中是分开存储的 ; 成员变量 : 普通成员变量 : 在 对象 指针指向的内存中存储 , 存储方式与 C 语言中的 struct 结构体...存储变量的 内存结布局 和 字节对齐方式 相同 ; 静态成员变量 : 在 内存 中的 全局数据 中存储 ; 成员函数 : 不管是 普通成员函数 还是 静态成员函数 , 都存储在 代码段 中 ; C++...语言函数 ; 参数个数 : 将 C++ 类成员函数 转为 C 语言函数 后 , 对应的 C 语言函数 的第一个参数必须是 指定的类型指针参数 , 也就是说 , 假如 C++ 类成员函数 n 个参数

38851

C语言笔记】内存笔记

C语言程序需要载入内存才可以运行,其不同的数据保存在不同的区域。所使用的内存可以分成两类:一类是静态存储,另一类是动态存储C语言程序的存储如下图所示: ?...2、动态存储 动态存储主要分为两类:一类是栈(Stack)内存区域,栈内存是由编译器管理的;另一类是堆(Heap)内存区域,堆内存由程序调用具体的库函数来分配的。...2.1栈内存区域 2.1.1栈的相关概念 栈内存的使用很大的程度上依赖于处理器的硬件机制。在处理器中,一个寄存器来表示当前栈指针的位置。...按照C语言内存分配规则,如果内存分配成功,返回的是内存的地址;如果内存分配不成功,将返回NULL(0x0),表示一个无效的地址。 (3)malloc在分配内存的时候,是从低地址至高地址方向。...以上是对于C语言内存的一些笔记。如有错误,欢迎指出!

1.4K31

C语言编程—内存管理

C语言中的动态内存管理。C语言内存的分配和管理提供了几个函数。这些函数可以在 头文件中找到。 在C语言中,内存是通过指针变量来管理的。...C语言提供了一些函数和运算符,使得程序员可以对内存进行操作,包括分配、释放、移动和复制等。 注意:void * 类型表示未确定类型的指针。...CC++ 规定 void * 类型可以通过类型转换强制转换为任何其它类型的指针。 动态分配内存 编程时,如果您预先知道数组的大小,那么定义数组时就比较容易。...重新调整内存的大小和释放内存 当程序退出时,操作系统会自动释放所有分配给程序的内存,但是,建议您在不需要内存时,都应该调用函数 free() 来释放内存。...C 语言中常用的内存管理函数和运算符 malloc() 函数:用于动态分配内存。它接受一个参数,即需要分配的内存大小(以字节为单位),并返回一个指向分配内存的指针。

18230
领券