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

《嵌入式LINUX与物联网软件开发 C语言内核深度解析》学习1——C语言与内存 什么是程序? 程序=数据+算法。 内存分类: 分静态内存SRAM、动态内存DRAM。 DRAM有好多代,比如DDR1、DDR2、DDR3、DDR4……。 内存结构: 1、冯诺依曼结构:代码和数据存储在同一个存储器中,并且共用一条传输总线,因此影响到了数据处理速度。 2、哈佛结构:指令和数据分开存储的结构。执行效率高。 这两种结构各有各的用处。 程序为什么要有内存 用来存储数据 几种语言对内存... 阅读详情

《嵌入式Linux与物联网开发——C语言内核深度解析》这本书很适合新人嵌入式工程师学习,这本书有两个推荐的点:第一个是以嵌入式的视角重新解读C语言,在实际硬件和应用场景下重新讲解相关概念;第二个是补充了很多关于嵌入式c语言的细节,这些细节在工作中常见,但在课堂上不会讲。接下来一段时间我会把之前做的笔记陆续整理发出来,当作个人一次复习的小结。

第01章 c语言与内存

1.2 程序:数据+算法

静态内存SRAM和动态内存DRAM:
SRAM:性能高,速度快,昂贵,如CPU的一级缓冲、二级缓冲
DRAM:慢,便宜,DDR是一种改进型的RAM,可以在一个时钟读写两次数据。


冯诺依曼结构和哈佛结构:
按照数据(全局变量和局部变量)和代码(函数)的存储方式不同:
冯诺伊曼:数据和代码放在一起,共用一条传输总线
哈佛:数据和代码分开,中央处理器首先到程序指令存储器钟读取指令内容,得到数据地址,再到相应的数据存储器中读取数据。

1.3 位、字节、半字、字的概念和内存位宽

三总线:地址总线、数据总线、控制总线。
如向内存中写入数据,则控制总线上传输写命令,地址总线上传输内存地址,数据总线传输要写入内存的数据。
多少位CPU指的就是数据总线位数。数据位数越多,一次传输处理的数据就越多

内存位宽(内存数据线的数量)是指在一定时间(时间指的是一个时钟周期)内所能传送数据的位数,位数越大,则所能传输的数据量就越大。


1.4 内存编址和寻址、内存对齐


内存编址以字节为单位
写程序时尽量要配合硬件特点

内存对齐:计算机系统对基本类型数据在内存中存放的位置有限制,
它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对齐。

1.5 c语言如何操作内存

c语言中数据类型的本质含义,是表示一个内存格子的长度和解析方法。
假如有一个内存地址,可以通过给这个内存地址不同的类型来指定这个内存单元格子中二进制的解析方法。
在C语言中,函数就是一段代码的封装,函数名的实质就是这一段代码的首地址,所以说函数名的本质也是一个内存地址。

指针是一个变量,且这个变量是专门用来存放地址的。
指针变量和普通变量没有任何区别,类型只是对其所修饰的数字或者符号所代表内存空间的长度和解析方法的规定。

数组定义就是在内存中开辟一块连续的内存空间,数组名就是其开辟的内存空间的首地址,即数组名就相当于一个指针,放着这个数组的首元素地址。

1.6 内存管理之结构体

结构体属于聚合数据类型,提供一种把各种相关且类型可能不同的数据组合到一起的手段。
结构体变量在被定义后,编译器在编译的时候回为所有成员分配空间。
向函数传递结构时,实际上时传递结构成员的值,即都是值传递方式。
但直接值传递整个结构体变量存在很大的缺陷,因为当执行函数调用时,数据压栈需要开销,因此解决方案是传递结构体
变量的指针。

题外话:结构体内嵌指针实现面对对象
structs
{
    int age;
    void (*pFunc)(void);        //函数指针
}

1.7 内存管理之栈

栈是一种数据结构,C语言中使用栈来保存局部变量。本质是一种维护内存的机制。

栈特点:入口即出口,先进后出。
队:有入口有出口,先进先出

栈应用:局部变量和函数调用
当我们在C语言中定义一个局部变量时,编译器会在栈中分配一段空间(4字节)给这个局部变量用。
对应操作为入栈,栈指针的移动和内存分配时自动完成的,不需要程序参与。
函数退出的时候,局部变量会被释放,对应操作时出栈。

栈大小不灵活,怕溢出,要避免定义局部变量太多导致溢出。

1.8 内存管理值堆


堆:一种动态内存管理方式。malloc和free申请的内存来源于堆内存。
需要内存容量比较大时,以及需要反复使用及释放时(动态特性),很多数据结构的实现都要使用内存。

特点:容量不限,动态分配;申请和释放需要手工进行(注意避免内存泄漏)。

void *malloc(size_t size);
void *calooc(size_t nmemb, size_t size);    //nmemb个单元,每个的单元size字节
void *realloc(void *ptr, size_t size);      //改变原来申请的空间的大小

局部变量存在栈(stack)中,全局变量存在静态数据区中,动态申请数据存在于堆(heap)中。

静态局部变量和全局变量存储在静态存储区,编译器在编译程序时就确定了静态存储区的大小。

C语言深度解析PDF版 对C语言深入的解析,学习C语言的好资料,可以对C语言有更深刻的理解 立即下载

相关推荐

从零搭建宝兰德BES单机版:分离式安装、环境变量配置到控制台访问的避坑指南

本文详细介绍了从零搭建宝兰德BES单机版的完整流程,包括分离式安装、环境变量配置和控制台访问的避坑指南。针对中间件安装部署中的常见问题,提供了账号规划、JDK配置、实例创建和防火墙设置等实用解决方案,帮助开发者和运维人员高效完成BES中间件的部署工作。

weixin_32576389的博客 375

C语言深度剖析-读书简记

写在前面 最近再次温习C语言深度剖析,对C语言的一些易错的和重要的知识点做了以下整理。 第一章 关键字 一 register 1 关键字请求编译器尽可能将变量存在CPU内部的寄存器内中,避免存入聂功通过寻址访问来提高效率。 2 变量类型必须是CPU寄存器可以接受的类型,即必须是一个单个的值,其长度小于或者等于整型的长度。 3 不能用&来获取register变量的

java、c++、机器学习方向King 1283

用Matlab和CVX搞定原子范数最小化:一个信号处理小白的避坑实践

本文详细介绍了如何使用Matlab和CVX实现原子范数最小化(Atomic norm minimization),特别适合信号处理初学者。从CVX安装配置、核心代码解析到实战中的典型问题与解决方案,提供了全面的避坑指南。通过具体案例展示了原子范数在频率估计和DOA估计中的优势,并给出性能优化策略和可视化方法。

weixin_28731231的博客 232

malloc,calloc区别

C语言的标准内存分配函数:malloc,calloc,realloc,free等。 malloc与calloc的区别为1块与n块的区别: malloc调用形式为(类型*)malloc(size):在内存的动态存储区中分配一块长度为“size”字节的连续区域,返回该区域的首地址。 calloc调用形式为(类型*)calloc(n,size):在内存的动态存储区中分配n块长度为“size”字节的...

qq_35608277的博客 3万+

猫耳语音下载(mediadown)

西宾猫耳语音下载工具,能够帮助你下载猫耳音频节目。如果你是会员,它还能帮你下载会员节目。

new_stranger的专栏 2492

Windows与Linux安装miniconda并启动python项目及指令

官方介绍:Miniconda 是 conda 的免费最小安装程序。它是 Anaconda 的一个小型引导版本,仅​​包含 conda、Python、它们都依赖的包以及少量其他有用的包(例如 pip、zlib 等)。如果您需要更多软件包,请使用该 命令从 Anaconda 公共存储库或其他渠道(例如 conda-forge 或 bioconda)默认提供的数千个软件包中进行安装。minicoda下载地址最好挂个梯子。如果你需要指定版本的conda,可以在这里下载历史版本的miniconda。

一直走的很慢的鸭子 3191

C语言超详尽解析

CI/CD 流程通常包括:代码提交 (Code Commit),自动化构建 (Automated Build),自动化测试 (Automated Testing),代码审查 (Code Review),自动化部署 (Automated Deployment)。代码生成工具 (例如 Ragel 状态机编译器,Bison 语法分析器生成器,Flex 词法分析器生成器) 可以根据规范 (例如状态机描述,语法规则,词法规则) 自动生成 C 代码,提高开发效率和代码质量。选择合适的代码风格指南,并在项目中统一遵守。

ZhuBin365的博客 953

Ubuntu下Charm-Crypto安装

经过一下午的努力终于是把Charm-Crypto给安上了,经过查询资料,大致有三种方案(两坑一可行)。 适用于我的电脑的是Ubuntu 18.04版本。 第一种方案是根据连接https://pypi.org/project/charm-crypto/的教程进行安装,但是该方案的优势在于下载快速,缺陷在于Ubuntu系统仅仅更新到13+版本。 第二种就是网络博客上的介绍,内容与第一种较类似,但是有16+,18+成功的例子,缺点就是bug太多,我大部分时间都耗在了这上边,而且还没有成功。 第三中是github上

Mr.Yi的博客 2284

malloc、calloc、realloc、free函数的使用

malloc、realloc、calloc、free函数大部分在 stdlib.h 文件中 malloc 函数:从堆上分配内存 calloc 函数: 从堆上分配内存并清零 realloc 函数:在之前分配的内存块的基础上,将内存重新分配为更大或者更小的部分 free 函数:将内存块返回堆 一、malloc函数 C 库函数void *malloc(size_t size...

qq_34692743的博客 7172

NLP-Beginner 任务一:基于机器学习的文本分类(超详细!!)

NLP-Beginner 任务一:基于机器学习的文本分类传送门一. 介绍1.1 任务简介1.2 数据集1.3 流程介绍二. 特征提取2.1 词袋特征(Bag-of-word)2.2 N元特征 (N-gram)三. 最优化求解3.1 Softmax回归介绍3.2 损失函数3.3 梯度下降3.4 学习率四. 代码及实现4.1 实验设置4.2 结果展示4.3 代码新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、

0oTedo0 9934

【unity游戏开发入门到精通——UGUI】UI控件 —— Toggle开关切换控件

【unity游戏开发入门到精通——UGUI】UI控件 —— Toggle开关切换控件

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1845

【C语言深度剖析】— 史上最全关键字(爆肝半个月、数万字详解、考试必备)

什么是变量 在内存中开辟特定大小的空间,用来保存数据 所有的变量,本质都是要在内存中的某个位置开辟空间的! 变量的定义与声明 类型 变量名 = 默认值 //定义类型格式 char c = 'c'; //初始化 c = 'd'; //赋值 赋值的意思就是这个变量c已经存在了,存在的本质就是这个变量对应的空间已经开辟出来了 ,换言之就是将'd'字符直接放到一个已经存在的空间中。 很不幸,在C语言中,初始化和赋值的差别不是很大,唯一可能会出现的差..

兴趣使然的编程菜鸟 1795

T507 buildroot linux4.9之RLT8211F 1000M以太网开发调试

调试T507的gmac,解决该RTL8211F 1000m以太网中调试遇到的问题

目前从事linux驱动开发,多交流多学习吧 688

【C语言指南】C语言内存管理 深度解析

C语言是一种强大而灵活的编程语言,为程序员提供了对内存的直接控制能力。这种对内存的控制使得C语言非常灵活,但也带来了更大的责任。 在C语言中,程序员需要负责内存的分配和释放,否则可能会导致内存泄漏和其他内存管理问题。本文将深入探讨C语言的内存管理机制,包括内存分配、内存释放、内存泄漏等问题。

倔强的石头的博客 8051

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

《C语言内核深度解析》——笔记及拓展(1)

文章是我前几天读了朱有鹏,张先凤老师的《嵌入式Linux与物联网软件开发:C语言内核深度解析》写的,拜读之后,虽没有醍醐灌顶,至少解开了我之前的一些疑惑。以前学C语言,就是在IDE上编一下代码,编译器会有错误有警告提示,很少思考过变量、指针、结构体、函数之间,及所编代码和当前所运行系统的关系(系统内存有多大,运行速度怎样,怎样优化算法)。等我真正学了嵌入式,才开始思考上面的问题,才开始去了解软件与硬件的关系。本文章是边复习边记笔记,跟书籍目录不一样,以后可能会补充及修改。有纰漏请指出,转载请说明。

weixin_45817947的博客 419

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C 语言进程内存布局深度解析:从虚拟地址到内存管理的全攻略

本文以Linux系统为例,详细解析C程序运行时内存布局的五大核心区域:代码段(存放指令)、数据段(存储全局/静态变量)、堆(动态分配)、栈(函数调用)和内存映射段。通过地址打印示例演示变量存储位置,分析栈溢出、悬垂指针等典型陷阱,对比静态数据与动态内存的差异。强调堆内存管理的"分配-释放"配对原则,并介绍valgrind工具检测内存错误。最后提出三大编程准则:栈优先、慎用静态变量、严格管理堆内存,帮助开发者规避常见内存问题,提升程序健壮性。

weixin_55932020的博客 1461

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

《C语言内核深度解析》笔记(3):指针才是C语言的精髓

第03章 指针才是C语言的精髓 3.2 指针 int a = 10; int *p = &a; 指针变量p和普通变量之间没有本质区别,都是变量空间放了一个数值,只是p里面的数值比较特殊,是a空间的地址,它 指向了空间a。 变量空间的首字节地址,作为整个空间的地址: 实际上内存中的每个自己空间都有一个地址,如果内核由32位地址线,地址以二进制表示,既然 每个字节对应的地址都是32位,那么存放地址的变量大小也是32位的,即四个字节。但只有首字节地址才能作为整个a空间的地址。 指针变量的类型作..

wangxiaobeia的博客 3450

Jupyter C内核架构深度解析:交互式C语言编程的技术实现与优化策略

传统C语言开发环境中,编译、链接、执行三个环节的分离导致开发效率低下,特别是对于教学场景和快速原型开发。开发者需要频繁在编辑器、终端、调试器之间切换,编译错误信息往往不够直观,难以快速定位问题。Jupyter C内核通过将C语言执行环境无缝集成到Jupyter Notebook生态中,解决了这一核心痛点。 该项目的技术挑战主要体现在三个方面:实时编译反馈机制的实现、临时文件生命周期的管理、以及编

gitblog_00660的博客 1039

C语言深度解析:从零到系统级开发的完整指南

核心学习路径基础阶段:掌握变量、指针、内存管理、结构体。进阶阶段:学习文件操作、系统调用、多线程(C11标准)。实战阶段:开发嵌入式项目(如STM32控制硬件)、Linux内核模块。推荐资源博客Android洋芋-优快云博客。在线课程:Coursera的《C语言专项课程》、B站《C语言从入门到精通》。博客专栏:《C语言进阶黑科技:指针、多线程与硬件控制的实战秘籍》立即行动:从“Hello World”开始,逐步构建自己的C语言项目,探索底层开发的无限可能!

全栈 1393

【精通内核】计算机程序的本质、内存组成与ELF格式深度解析

精通真正的高并发编程,不仅仅是API的使用和原理!计算机最基础的程序是怎么组成的呢?本文深入浅出,讲解程序的本质(编译的过程)、组成(程序所需的内存)与格式(ELF),希望读者可以构建计算机从写代码到编译到执行的链路的底层思维。...

小明的Java问道之路 14万+

《C语言内核深度解析》——笔记及拓展(3)

结构体属于聚合数据类型,结构体变量在被定义后,编译器在编译时会为所有成员分配空间结构体变量名代表的是整个结构体变量,不像数组名代表地址char id[8];int age;}Student;return 0;什么是man手册man手册就是linux下提供给用户查看linux语法的一本书,当用户遇到一些不懂的命令/函数的时候,不用刻意地去记住命令/函数是什么,只需要记住怎么在man手册中查询即可。

weixin_45817947的博客 280

C语言变量与内存深度解析

本文详细介绍了C语言中的变量类型、内存布局和作用域规则。主要内容包括: 进程内存空间分布:划分为栈、堆、BSS段、数据段和代码段,分别存储局部变量、动态内存、未初始化全局变量等。 变量类型与存储: 局部变量存储在栈上,函数结束时销毁 静态变量存储在数据段/BSS段,生命周期为整个程序 全局变量也存储在数据段/BSS段 常量存储在代码段或数据段 作用域规则: 块作用域(花括号内) 文件作用域(全局变量) 函数作用域(goto标签) 常见陷阱:包括返回局部变量地址、未初始化变量等问题及解决方案。

Shylock_Mister的博客 917

嵌入式Linux与物联网软件开发:C语言内核深度解析

嵌入式Linux与物联网软件开发:C语言内核深度解析 1.C语言与内存 1.引言 2。计算机程序运行的目的 3.位、半字、字的概念和内存位宽 4.内存编址和寻址、内存对齐 5.C语言如何操作内存 6.内存管理之结构体 7.内存管理之栈(stack) 8.内存管理之堆 2.C语言位操作 1.引言 2.常用位与寄存器 3...

分享嵌入式,移动端,智能应用,数据库等专业板块,记录知识碎片!!! 1702

《C语言内核深度解析》笔记(2):c语言位操作

《嵌入式Linux与物联网开发——C语言内核深度解析》这本书很适合新人嵌入式工程师学习,这本书有两个推荐的点:第一个是以嵌入式的视角重新解读C语言,在实际硬件和应用场景下重新讲解相关概念;第二个是补充了很多关于嵌入式c语言的细节,这些细节在工作中常见,但在课堂上不会讲。接下来一段时间我会把之前做的笔记陆续整理发出来,当作个人一次复习的小结。 第02章 C语言位操作 2.2 常用位运算符 按位取反(~)与非的区别:~10 = 5; !10 = 0 左移位(<<): x <<

wangxiaobeia的博客 3602

C/C++ 内存管理深度解析:从内存分布到实践应用(malloc和new,free和delete的对比与使用,定位 new )

本文深入探讨了C/C++内存管理的核心概念与最佳实践。首先,文章分析了C/C++程序的内存分布,包括内核空间、栈区、堆区、数据段和代码段,解释了各区域的功能与管理方式。接着,详细解析了C语言中的动态内存管理函数(malloc、calloc、realloc、free)及其使用场景,并对比了C++中的new/delete操作符,强调了其在自定义类型中的构造与析构功能。文章还介绍了定位new表达式及其在内存池技术中的应用。最后,总结了malloc/free与new/delete的深度对比,并提供了内存管理的最佳实

2501_90200491的博客 2486

《C语言内核深度解析》小结

数组 数组的元素类型决定数组如何定义 如: 元素char 数组定义char a[6]; 元素char * 数组定义char *a[6]; 元素char * 数组定义char *a[6]; 数组元素决定数组指针的类型 如: 元素char 数组定义char a[6] 数组指针char (*p)[6] p = a; 元素char * 数组定义char...

QQ2558030393的博客 768
下一篇: 《C语言内核深度解析》笔记(2):c语言位操作
爆裂红鸟
博客等级 码龄10年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值