《C语言深度刨析》整理--内存管理

C语言深度解剖 PDF 分享 链接:https://pan.baidu.com/s/1U-8L7ZY5_sLpk4p0J302Mg           提取码:d8nu 相关推荐 [Objective-c程序设计] 中文编程·学习进阶_易语言 Windows API开发详解 函数、接口、编程实例 Programming in ... 阅读详情
 

一、内存的存储区

1.、栈(堆栈)区、堆区、静态区等

(1)、栈区(堆栈)(stack):由编译器自动分配释放 ,存放函数参数值,局部变量等。栈上的内容只在函数的范围内存在,当函数运行结束,这些内容也会自动被毁.其特点是:效率高,但空间大小有限

(2)、堆区(heap) :一般由程序员分配释放 , 由malloc 系列函数或new 操作符分配的内存。其生命周期由free 或delete 决定。在没有释放之前一直存在,直到程序结束,其特点是:使用灵活,空间比较大,但容易出错

(3)、全局区(静态区):保存自动全局变量和static 变量(包括static 全局和局部变量),静态区的内容在总个程序的生命周期内都存在,由编译器在编译的时候分配

(4)、文字常量区:常量字符串就是放在这里的。 程序结束后由系统释放

(5)、程序代码区:存放函数体的二进制代码。

 二、c语言内存管理五条原则

     【规则1】用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。 

 

(很有可能申请连续一块内存失败)

     

【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。 

     【规则3】避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。 

     【规则4】动态内存的申请与释放必须配对,防止内存泄漏。 (比如malloc和free,new和delete)

     【规则5】用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。

三、常见的内存错误

       1. 未给指针赋值,指针指向非法的值

       (1)

  1. #include "stdio.h"  
  2. #include "string.h"  
  3. struct node  
  4. {  
  5.     char *name;  
  6.     int number;  
  7. }nNode,*pNode;  
  8. int main()  
  9. {  
  10.     strcpy(nNode.name,"Jimy");  
  11.     pNode->number = 99;  
  12.     return 0;  
  13. }  

         解析:

         错误一:未给结构体申请内存空间,结构体指针pNode 指向非法内存导致程序异常

        错误二:未给结构体中指向char 类型的指针name 分配内存,name指向非法内存导致程序异常

     (2) 比较隐蔽指针未申请内存空间,指针指向非法的内存    

  1.     #include "stdio.h"  
  2.     #include "string.h"  
  3.     #include "stdlib.h"  
  4.   
  5.     struct node  
  6.     {  
  7.         char *name;  
  8.         int number;  
  9.     }nNode, *pNode;  
  10.   
  11.     int main()  
  12.     {  
  13. pNode = (struct node *)malloc(sizeof(struct node));  
  14.         strcpy(nNode.name, "Jimy");  
  15. pNode->number = 99;  
  16.   
  17. free(pNode);  
  18. return 0;  
  19.     }  

         解析:

         表面看来程序为struct node 分配了内存,但是结构体中的指针char *name 未分配内存,指针name 的指向仍然是非法的
  

     2. 没有分配总够的内存 

  1. #include "stdio.h"  
  2. #include "string.h"  
  3. #include "stdlib.h"  
  4.   
  5. struct node  
  6. {  
  7.     char *name;  
  8.     int number;  
  9. }nNode,*pNode;  
  10.   
  11. int main()  
  12. {  
  13.     <span style="color:#3333ff;"><strong>pNode = (struct node *)malloc(sizeof(struct node*));</strong></span>  
  14.   
  15.     strcpy(nNode.name,"Jimy");  
  16.     pNode->number = 99;  
  17.   
  18.     free(pNode);  
  19.     return 0;  
  20. }  

    解析:

    (1). 误将内存申请的大小 由sizeof(struct node)变成 sizeof(struct node *) 只申请了四个字节的内存大

    (2). 指针那么也未申请内存地址

  3. 为指针分配的内存太小

  1. char *p1 = “abcdefg”;  
  2. char *p2 = (char *)malloc(sizeof(char)*strlen(p1));  
  1. strcpy(p2,p1);  


       解析:

       指针p1所占的内存大小是 8,而为p2 申请的内存是 7个

      解决:

      char *p2  =  (char *)malloc(sizeof(char)*strlen(p1) + 1*sizeof(char));  

    4. 内存分配成功,但并未初始化

       (1) 指针的初始化

             初始化为有效的值: char *p = (char *)malloc(sizeof(char));

             初始化为NULL :       char *p = NULL;

          注:一般第二种比较常用,第二种写法也可以用来debug的时候检测assert调试;

       (2) 数组的初始化

             定义的时候初始化:  int  number[20]  = {0};

             定义后初始化:        memset(a, 0, sizeof(number);

     5. 内存越界

         这种情况比较常见于,访问数组的时候,循环变量控制的越界

        比如:  

  1. int a[10] = {0};  
  2. for (i = 0; i <= 10; i++)  
  3. {  
  4.    a[i] = i;  
  5. }  

        解析:

         数组变量越界了。数组循环变量的边界取值的原则一般是从0开始,采用半开半闭的结构,这样程序的可读性强

      6. 指针已经释放但是仍然被其他的代码调用

           通常有三种情况:

          第一种:free(p)之后,继续通过p 指针来访问内存。解决的办法就是给p 置NULL。

          第二种:函数返回栈内存。这是初学者最容易犯的错误。比如在函数内部定义了一个数组,却用return 语句返回指向该数组的指针。         

          第三种:内存使用太复杂,弄不清到底哪块内存被释放,哪块没有被释放。解决的办法是重新设计程序,改善对象之间的调用关系。

C语言华为面试汇总 C语言面试题总汇 原地址:http://blog.youkuaiyun.com/pfgmylove/article/details/3207236 4.    static有什么用途?(请至少说明两种) 1.限制变量的作用域 2.设置变量的存储域 7.    引用与指针有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 2) 不存在指向空 阅读详情

相关推荐

2022精心整理的C语言学习宝藏,值得收藏~

C 语言可以零基础入门,它的语法是很多高级编程语言的基础,比如说 Java、C++;并且起到承上启下的作用,向上可以学习高级编程语言,向下可以学习计算机组成原理、操作系统等等偏基础的计算机基础知识。 C语言相关电子书: 推荐书籍: 第一本书《阿哈C语言》的写书风格个人认为比较风趣幽默,对于培养兴趣,基础学习还是很不错的 《C程序设计语言》,机械工业出版社,作者Brian W. Kernighan / (美)Dennis M. Ritchie。C 语言之父写的,入门经典书籍。 《

编程与实战的博客 2473

VC字节对齐全攻略

  VC中下面几个结构体大小分别是多少呢struct MyStruct{    double m4;    char m1;    int  m3;};struct MyStruct {    char m1;    double m4;    int m3;};#pragma pack(push)//保存对齐状态#pragma pack(16)  //设置为16字节对齐struct test

sunewer的专栏 1955

C语言内存管理深度解析面试题及参考答案(2万字长文)

作用域是指变量或函数在程序中可见的范围。块作用域:在一对花括号{}内部声明的变量仅在该块内可见。函数作用域:在函数内部声明的变量在该函数内可见。文件作用域:在文件顶部或函数外部声明的变量在整个文件中可见,但不在其他文件中可见,除非使用了extern关键字。例如,在函数内部定义的变量只能在该函数内使用:int x = 10;// x 在此函数内可见func();// 下面这行代码会引发编译错误,因为 x 在 main 函数中不可见return 0;

大模型大数据攻城狮的专栏 1003

C语言深度剖析笔记(三)

指针 将数值存储到指定位置 int *p = (int *)0x12ff7c; *p =0x100; 或 *(int *)0x12ff7c =0x100; 数组 32位系统下 int a[5]; sizeof(a)=sizeof(int)*5=20 sizeof(a[0]) = sizeof(int)=4 sizeof(a[5]) =4 sizeof(&amp;a[0])=4 ...

weixin_43667308的博客 263

2022 精心整理的 C语言/C++ 语言学习宝藏,值得收藏~

知名大学计算机系开源课程收录: 浙江大学课程攻略共享计划 清华大学计算机系课程攻略 上海交通大学课程资料分享 北京航空航天大学(北航)课程作业资料共享计划 华北电力大学计算机系课程攻略 北京邮电大学计算机考研信息汇总 C++从入门到“精通“,我踩过的坑希望你可以绕着走_程序员编程指南的博客-优快云博客1 c++ 发展方向实验室开发C++绝对是工科生中的第一大语言,C++兼具面向过程以及面向对象的特性,既拥有比较优秀的运行速度,又有良好的大型项目开发能力,那简直可以制霸高校实验室了。后端开发学了

编程与实战的博客 9021

内存管理与调试详细剖析

深入剖析内存管理机制和策略,解析常见的内存问题调试方法

C++内存问题

一、内存分配方式 1.从静态存储区域分配。 内存在程序编译的过程中就已经分配好,这块内存在程序的整个运行期间都存在。例如:全局变量和static变量。 2.在栈上创建。 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数运行结束时,这些存储单元会被自动释放,栈内存分配运算内置于处理器的指令集中,效率很高,但分配的内存数量有限。 3.从堆上分配 又被称为动态内存分配。程序在运行...

luweiwei123的博客 254

带你一分钟了解电感与磁珠的区别

在电路设计中会经常使用到电感和磁珠,虽然在电路中的作用有所不同,但它们都属于磁性电子元器件,本文简单介绍下电感和磁珠的区别电感和磁珠电感和磁珠的结构主要由磁性材料金属线圈和外壳组成,具体结构如下图所示:电感磁珠结构图电感其实是金属线圈缠绕在磁芯上,而磁珠是在内部折叠后外围包裹着铁氧体磁性材料。电感器(Inductor)又称扼流器、电抗器、动态电抗器是储能器件,能够把电能转化为磁能而存储起来的元件。磁珠则是能量转换(消耗)器件,将流过他的高频信号以热能的形式消耗掉。

攻城狮鹏哥 1410

C语言核心技术深度解析:从内存管理到算法实现

本文档系统整理C语言核心技术面试题,涵盖内存管理、指针操作、位运算等关键知识点。重点解析结构体内存对齐原理、const/static等关键字应用、函数指针与回调机制、安全宏定义实现等核心内容。通过经典算法实例和优化技巧,帮助开发者深入理解C语言底层机制,提升代码质量和性能。文档还提供堆栈内存对比、动态内存安全防护等实用方案,并分析常见算法复杂度。作为嵌入式开发和C语言编程的实用参考,旨在帮助读者巩固基础,提高解决实际问题的能力,为技术面试和项目开发提供有力支持。

xuewenyu_的博客 759

基于STM32L4XX 、HAL库的DRV8311三相无刷直流电机(BLDC)驱动应用C语言程序设计

是德州仪器(TI)推出的一款针对三相无刷直流(BLDC)电机或永磁同步电机(PMSM)的集成驱动器芯片。:集成了三个半桥MOSFET、门极驱动电路、电荷泵(支持100%占空比)、稳压器以及多种保护电路。:工作电压最高可达,持续输出电流可达,峰值电流可达。:通过引脚直接控制每个半桥的PWM和使能。这种方式需要MCU输出6路信号,控制更灵活。:通过SPI总线配置内部寄存器,仅需PWMA/B/C三路PWM信号即可控制电机。可以读取故障状态、配置参数(如死区时间、电流保护阈值等),是更常用和推荐的方式。

PP_Cottage的博客 553

如何通过单步调试的方法,找到 SAP Gateway 到底把 Fiori 应用发送的 OData 请求,投递到哪一台 ABAP 后台服务器了?

这是一个 Count 请求,得到服务器响应的数据是 204,这个 204 会以数字的形式,显示在 Fiori Launchpad tile 上。那如果当前 Gateway 系统可以连接到多台 ABAP 后台服务器,比如下图所示,可以连接 SAP S/4HANA,ERP 或者 SAP CRM,我怎么知道 SAP UI5 应用上显示的数据,到底来自哪一台 ABAP 后台服务器呢?,就是上图 ABAP 调试器里断点停留的位置,即 SAP Frontend 服务器,通过 RFC 将 OData 请求投递给。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 642

《C语言深度刨析》整理--指针和数组

指针是c/c++ 精华,没有很好的掌握指针,基本是没有掌握c/c++,对c/c++ 也是一知半解,往往指针掌握不好,也不能很好的理解数组和内存管理 一、指针在系统同占用的空间         在32位系统中,指针所占空间的大小为 4个字节,与指针指向的数据类型无关;        比如   int  *p; char *p;  double *p; int **p;  已经执行构造类型的结构

xyk_code的专栏 471

基于Spring Boot 3 + Vue 3 + Vite的现代化社区订餐系统设计与实现

本文将详细阐述系统的整体架构、数据库设计、核心功能模块(用户管理、餐厅管理、菜品浏览、购物车、订单管理)的实现细节,并提供关键代码示例。<el-input v-model="loginForm.password" type="password" placeholder="密码" prefix-icon="Lock" show-password />.requestMatchers("/api/auth/**", "/api/dishes/public/**").permitAll() // 公开接口。

2201_76125393的博客 468

【整理】2天带你学完C语言,使用Chatgpt进行深度个人学习

声明:本文章系列基于chatgpt3.5模型算法导出,个人将结合自己所学进行系统的整理和修改,全文约3.56万字。声明:本文章系列基于chatgpt3.5模型算法导出,个人将结合自己所学进行系统的整理和修改,全文约3.56万字。

Phofomy的博客 433

论文阅读:Training language models to follow instructions with human feedback

这篇论文的目标是通过引入一种基于人类反馈的训练方法,来让语言模型更好地按照用户意图行事。这是因为大规模语言模型虽然强大,但有时候会生成不准确、有偏见或者对用户无帮助的内容,这说明它们和用户的需求之间存在一定的“错位”。论文提出了一个新方法,将 GPT-3 进行优化,称为示例数据与监督学习:让人类标注员生成一些正确行为的示例,并使用这些示例来初步优化模型。比较数据与奖励模型:让标注员比较模型生成的多个输出,并将其排序,从中学到模型输出的优劣规则。强化学习优化:基于这些规则,使用强化学习算法进一步优化模型。

CSPhD-winston的博客 1715

YOLOv11改进策略【卷积层】| DEConv: 强度信息与梯度特征融合的细节增强 适用于小目标与细节目标检测任务

本文记录的是利用 模块优化 的目标检测网络模型。(Detail-Enhanced Convolution,细节增强卷积)的设计旨在,解决 目标检测网络中传统普通卷积缺乏目标细节相关先验、对小目标边缘、目标与背景边界等关键细节捕捉能力不足的问题,同时避免引入额外参数量与计算开销,以适配 对实时推理性能与检测精度的双重需求。DEA-Net: Single image dehazing based on detail-enhanced convolution and content-guided atte

Limiiiing的博客 1497

《C语言内核深度解析》笔记(1):c语言与内存

《嵌入式Linux与物联网开发——C语言内核深度解析》这本书很适合新人嵌入式工程师学习,这本书有两个推荐的点:第一个是以嵌入式的视角重新解读C语言,在实际硬件和应用场景下重新讲解相关概念;第二个是补充了很多关于嵌入式c语言的细节,这些细节在工作中常见,但在课堂上不会讲。接下来一段时间我会把之前做的笔记陆续整理发出来,当作个人一次复习的小结。 第01章 c语言与内存 1.2 程序:数据+算法 静态内存SRAM和动态内存DRAM: SRAM:性能高,速度快,昂贵,如CPU的一级缓冲、二级缓冲 DRA

wangxiaobeia的博客 4978

智能化教育改革中的教师角色转变:AI应用架构师如何设计“人机协同”系统?

个性化与规模化的矛盾:如何用AI实现规模化的个性化学习,同时保留教师的“人文温度”?自动化与自主性的矛盾:如何用AI自动化流程(如批改),同时避免教师沦为“AI操作工人”?数据驱动与经验驱动的矛盾:如何平衡AI的“数据决策”与教师的“经验决策”,避免“算法偏见”或“经验固化”?在智能化教育改革中,教师始终是教育的核心——AI系统是“辅助工具”,而非“替代者”。

小白菜的博客 1269

C 语言核心知识点整理

一、基础语法与核心概念​。二、嵌入式特化知识​。三、进阶理解与实践​。四、代码设计与优化​。

2401_85199775的博客 394

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C语言-深度理解

经过几天的整理,我将C语言中一些难度比较高的语法和需要的注意点列出来,还有很多没有整理出来,比如最基本的数据类型、选择分支循环的语法,因为那些在C语言中使用得比较多也比较熟,所以就在此省略。 一、指针 (*p) 1、 数据类型的本质是固定内存块大小的别名。        指针也是一种数据类型,占4个字节,用来保存地址,指针指向谁就把谁的地址传给指针。 2、指针变量和他所指向的内存空间变量是

一念之间、 972

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C语言深度解析:让你真正掌握编程核心

学习C语言不仅是掌握一种编程语言,更是深入理解编程核心的过程。通过C语言的学习,你可以更加深入地理解计算机的工作原理、内存管理、数据结构、算法等编程基础知识。C语言作为编程领域的基础语言,对于想要深入理解和掌握编程核心的人来说,具有不可替代的地位。下面将从C语言的特点、学习方法和实际应用等方面,进行深度解析,帮助你真正掌握这一强大的编程语言。总之,C语言是一门强大而基础的编程语言,通过学习它,你可以真正掌握编程的核心知识和技能。希望本文的解析能够帮助你在学习C语言的道路上更加顺利,取得更好的成果。

D_ovis的博客 1093

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C语言库函数源码下载仓库:深度解析C语言库函数核心实现

C语言库函数源码下载仓库:深度解析C语言库函数核心实现 【下载地址】C语言库函数源码下载仓库 此开源项目提供了一份完整的C语言库函数源码,涵盖了常用的标准库函数实现,是深入了解C语言标准库内部工作机制的宝贵资源。源码经过精心整理,结构清晰,便于阅读和理解,非常适合C语言学习者和开发者使用。通过下载并阅读这些源码,您可以深...

gitblog_06710的博客 377

《C语言深度剖析》面试题整理

原文地址 :http://blog.youkuaiyun.com/fovwin/article/details/10050803#comments 请在40分钟内完成以下20道C语言基础题。在没有任何提示的情况下,如果能得满分,那么你可以扔掉本书了,你的水平已经大大超过了作者;如果能的80分以上,说明你的C语言基础还不错,学习本书可能会比较轻松;如果得分在50分以下,也不要气馁,努力学习就行了;如果不小

XQ_sunny 1685

内存池性能急剧下降?,深度剖析C语言碎片成因与智能整理方案

解决内存池性能下降难题,深入解析C语言内存池的碎片整理策略。涵盖高频分配场景下的合并回收、空闲链表优化等核心方法,提升内存利用率与响应速度。方案兼顾效率与稳定性,适用于服务器、嵌入式系统开发,值得收藏。

BytePulse的博客 997

在Turbo C与386电脑上考古式学习C语言:回归编程本质的深度体验

C语言作为一门贴近硬件、注重内存管理的系统级编程语言,其核心价值在于对计算机底层原理的深刻理解。从编译链接的基本过程,到指针操作与内存布局的机制,再到标准库函数的契约与局限,这些基础概念构成了掌握C语言的基石。理解这些原理不仅能帮助开发者编写出更高效、更健壮的程序,更是进行嵌入式开发、操作系统、编译器等领域技术实践的必备基础。通过模拟早期开发环境(如MS-DOS下的Turbo C)的约束,可以迫使学习者聚焦于C语言的核心机制,例如手动管理内存、深入理解指针和结构体,从而摆脱对现代IDE自动补全和智能提示的过

weixin_34345753的博客 472
上一篇: 《C语言深度刨析》整理--指针和数组
下一篇: 《C语言深度刨析》整理--函数和文件
xyk_code
博客等级 码龄15年 3粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值