C语言
文章平均质量分 51
学无止境2022
吉德林法则,把难题清清楚楚地写出来,便已经解决了一半。
展开
-
C++:指针 引用 普通变量适用场景
需要注意的是,指针和引用都可以用于间接访问和修改内存中的数据,但它们有一些区别。使用指针的情况: 指针是一个变量,它存储了一个内存地址。使用普通变量的情况: 普通变量是最基本的数据类型,它存储了一个特定的值。使用引用的情况: 引用是一个已存在对象的别名,它提供了对对象的直接访问。当需要在函数中修改传递的参数值时,可以使用指针作为函数的参数。当需要在函数中修改传递的参数值时,可以使用引用作为函数的参数。当只需要存储和操作一个特定的值时,可以使用普通变量。当需要在函数之间共享数据时,可以使用指针。原创 2024-03-20 19:23:33 · 266 阅读 · 0 评论 -
定义变量(内存)时 定义在堆区 栈区 还是全局区-根据所需变量的特点选择合适的内存区域-作用范围和生命周期
当需要定义大内存数组时,通常应该将其定义在堆区。堆区是用于动态分配内存的区域,它的大小由操作系统决定。在堆区分配内存可以通过使用关键字"new"来实现,例如:int* arr = new int[1000]。在堆区分配的内存需要手动释放,以避免内存泄漏,可以使用关键字"delete"来释放内存,例如:delete[] arr。相比之下,栈区是用于存储局部变量和函数调用的区域,它的大小有限。在栈区定义的数组大小通常较小,且会随着函数的结束而自动释放,无需手动释放。原创 2024-03-05 10:59:09 · 359 阅读 · 1 评论 -
一直报段错误----函数内部的结构体指针必须使用malloc开辟空间吗
需要注意的是,如果使用了malloc函数进行内存分配,记得在不再需要使用结构体指针时,使用free函数释放相应的内存空间,以避免内存泄漏。3,作为函数参数传递:如果结构体指针是作为函数参数传递进来的,那么在函数内部可以直接使用传递进来的指针,而无需再进行内存分配。2, 使用静态分配:如果结构体的大小是已知的,并且在函数内部只需要临时使用,可以使用静态分配的方式来创建结构体指针。需要注意的是,在使用完结构体指针后,应该使用free函数释放所分配的内存,以避免内存泄漏。原创 2024-02-28 16:18:54 · 388 阅读 · 0 评论 -
函数里面的结构体指针指针本身和指针指向的结构体分别存储在什么区
需要注意的是,如果结构体对象存储在堆区,那么在使用完毕后需要手动释放内存(如使用free()函数),以防止内存泄漏。而如果结构体对象存储在栈区,它的生命周期将随着函数的结束而结束,无需手动释放内存。函数内部定义的结构体指针struct point* pe是一个指向结构体类型为point的指针变量。存储在栈区,而指针pe指向的结构体对象可能存储在堆区或者栈区,具体取决于结构体对象的创建方式。如果结构体对象是通过动态内存分配(如使用malloc()函数)创建的,那么它将存储在堆区。原创 2024-02-28 15:37:31 · 414 阅读 · 0 评论 -
值传递 地址传递
所谓的地址传递,指的就是函数的参数是数组名或者指针。传递的是数组的首地址或指针的值,而形参接收到的是地址,即指向实参的存储单元,形参和实参占用相同的存储单元,即形参和实参是相同的。值传递的特点是单向传递,即主调函数被调用时给形参分配存储单元,把实参的值传递给形参,在调用结束后,形参的存储单元被释放,而形参值的任何变化都不会影响到实参的值,实参的存储单元仍保留并维持数值不变。因此在数组名或指针作函数参数时所进行的传送只是地址传送,形参在取得该地址之后,与实参共同拥有一段内存空间,形参的变化也就是实参的变化。原创 2023-09-12 16:28:15 · 256 阅读 · 0 评论 -
switch case侯后面不加break
如果在switch case语句中不加break,程序会继续执行下一个case语句,直到遇到break或者switch case语句结束。这种情况通常被称为“case穿透”,可能会导致程序出现意外的行为,因此应该尽量避免。原创 2023-07-12 14:21:26 · 5930 阅读 · 0 评论 -
段错误(核心已转储)的本质
coredump叫做核心转储,实际上也就是进程运行过程中的一个内存快照,当进程crash的时候,操作系统接收异常指令之后,在进程crash之前,会把进程做一个内存快照,将这些信息保存在一个文件中,这个文件就是coredump文件。可执行文件是分段存储的,加载进内存也是分段的,如代码段、数据段、堆、栈等,段错误的原因往往是碰到了不该碰到的内存位置(如系统保留段、代码段不能被修改,使用空指针等)。core,核心(线圈),没有半导体之前,使用线圈内存,指代内存。stm32发生段错误会跳转到硬件错误中断。原创 2023-06-28 17:38:20 · 395 阅读 · 0 评论 -
keil 无法直接生成bin文件 fromelf:格式转换工具
在Keil MDK的集成开发环境中,默认情况下可以生成*.axf格式的调试文件和*.hex格式的可执行文件。示例: fromelf --bin --output=outfile.bin infile.axf。*.bin格式的文件在很多情况下也是需要的,借助Keil MDK 的工具既可以实现。本文将描述fromelf.exe工具的用法及bin 文件生成.输出文件语法(两种皆可以)其余具体选项可以参照上图。原创 2023-03-24 13:58:41 · 276 阅读 · 0 评论 -
32单片机裸机开发 时间片的作用 留出更多的时间给重要的任务去占用CPU
重要的任务10ms执行一次 不重要的任务100ms 或者500ms执行一次。32单片机逻辑开发 时间片的作用 留出更多的时间给重要的任务去占用CPU。原创 2023-03-10 16:11:35 · 226 阅读 · 0 评论 -
从源程序到可执行文件的四个过程
E选项:提示编译器执行完预处理就停下来,后边的编译、汇编、链接就先不执行了。-S选项:提示编译器执行完编译就停下来,不去执行汇编和链接了。源代码->汇编文件->机器码写成的目标文件->可执行文件。-c选项:提示编译器执行完汇编就停下来。-o选项:生成可执行文件。原创 2023-03-10 12:13:38 · 239 阅读 · 0 评论 -
学习单总线 找一个单总线通信例程
单总线的时钟单总线的数据传输原创 2023-03-09 00:13:00 · 104 阅读 · 0 评论 -
全双工的硬件要求
全双工的每一端都设置了发送器和接收器,因此能控制数据同时在两个方向进行传输。无线通信要想实现全双工 需要接受和发送不在同一频段??原创 2023-03-08 11:04:37 · 117 阅读 · 0 评论 -
static修饰的函数是可以被其他文件使用的
C语言和内存是紧密相关的,static主要是在编译链接阶段起作用,指导链接器将不同的函数按照链接脚本链接成可执行文件。一旦程序加载到内存中进行运行,那就没有什么static修饰的函数这种概念了,每个函数都一样,你能拿到函数指针就可以运行函数,这也是通过传递函数指针来调用static修饰的函数的原理。1.在文件中定义一个对外提供的函数,该函数在内部调用static修饰的函数,这就实现了间接调用static修饰的函数。2.将static修饰的函数的函数指针传递出去,其他文件可以通过函数指针进行调用。原创 2023-03-08 09:40:26 · 934 阅读 · 0 评论 -
can数据和串口数据同时到来,设置的can优先级比串口高那么串口数据将丢失 异步接收?
单片机两个串口同时有数据到来用复杂一点的 数据结构 队列解决这个问题环形缓冲区??接收到的数据放到一个二维数组中,接收一帧往数组中增加一帧,然后处理一帧丢弃一帧。增加和丢弃 用数组下标表示原创 2023-03-06 22:09:26 · 174 阅读 · 0 评论 -
数据结构链表适用于单片机吗?不适用为什么?
链表的索引比较复杂而单片机 致力于高效率 控制领域链表是如何进行索引的?原创 2023-03-06 21:16:41 · 245 阅读 · 0 评论 -
直接调用函数和用线程调用区别
而用线程调用函数,会新开一个线程去执行调用的函数,此时的线程就会继续往下执行,调用的函数已经交给新开的线程去执行了,相比直接在函数中调用,代码运行效率会更高一些。直接在函数中调用另一个函数,会在原来的线程中执行调用的函数,此时的线程会等待调用函数执行完后,再继续往下执行;本质上都是调用函数去执行,但在代码效率方面会有些差别。如果解决了你的疑惑,请采纳,祝学习愉快~原创 2023-02-27 10:30:58 · 586 阅读 · 0 评论 -
volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了
程序的本意是希望ISR_2中断产生时,在main当中调用do_something函数,但是,由于编译器判断在main函数里面没有修改过i,因此可能只执行一次对从i到某寄存器的读操作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致do_something永远也不会被调用。也就是说,我们要在threadFunc中的intSignal前面加上volatile关键字,这时候,编译器知道该变量的值会在外部改变,因此每次访问该变量时会重新读取。显然intSignal的值必须在外部被改变,否则该线程不会退出。原创 2023-02-21 13:56:12 · 169 阅读 · 0 评论 -
栈空间是如何被编译器开辟释放的?
记得最清楚的是栈有谁管理? 一般只能是由编译器或者os来管理,网上很多文章是说编译器管理的,但是一般一个程序跑起来之后,编译器怎么对他施加影响呢?到现在我都还是不明白。原创 2023-02-21 10:56:17 · 537 阅读 · 0 评论 -
linux 设备树文件语法
https://blog.csdn.net/hwx1546/article/details/123438411?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167653476716800186550437%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=167653476716800186550437&biz_id=0&utm_medium=d原创 2023-02-16 16:19:02 · 110 阅读 · 0 评论 -
单片机开发平台 下载程序和调试程序 的原理 (Jtag SWD)linux下调试程序的方法
GDB大名鼎鼎的程序调试工具,这个是个全能的工具,没有完不成的,只有你不知道的。那现在就剩下远程调试接口这个环节了,这个问题解决了,就把第五个问题也解决了,因为不管是通用的SOC,还是定制的SOC,CPU核心都是一致的,要么是ARM,要么是MIPS,要么51等等。3. IDE->第三方厂商实现KEIL的接口->第三方厂商的远程调试接口->第三方调试器->硬件调试接口->CPU. 所以,我们在JLINK架构图中看到,RDI接口其实是JLINK厂商定义的接口,而不是IDE厂商定义的。如何回答这两个问题?原创 2023-02-09 16:39:07 · 686 阅读 · 0 评论 -
C语言编译器 clang gcc AC5 AC6
详解三大编译器:gcc、llvm 和 clang。编译器GCC与Clang的异同。原创 2023-01-11 17:12:30 · 660 阅读 · 0 评论 -
STM32 GD32 keil 反汇编 根据 寄存器R14 MSP寄存器值 定位导致产生硬件中断的代码 查找产生硬件中断的原因
STM32跳至硬件错误中断(HardFault_Handle) 原因及参考解决方法。原创 2023-01-10 15:55:37 · 604 阅读 · 0 评论 -
回调函数使用 及 定义方法
然后就是main()函数了,它的第一句您应该看得懂了——它将函数glFun的地址赋值给变量pFun。main()函数的第二句中“*pFun”显然是取pFun所指向地址的内容,当然也就是取出了函数glFun()的内容,然后给定参数为2。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。该函数正好是一个以int为参数返回char的函数。我们要从指针的层次上理解函数——函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址。原创 2022-12-09 16:11:31 · 312 阅读 · 0 评论 -
什么是透传模块 本人用过数据透传模块也开发过透传模块
本人用过数据透传模块也开发过透传模块数据透传模块不需要做什么业务,就简简单单的 调试好硬件接口驱动 留出来个接受发送函数。例如 rs485收到的数据 由lora发送出去lora收到的数据由 usb发送出去。做这些项目 能让你更熟悉硬件接口驱动,对底层更加了解。但是由于业务量太小 积累不了多少软件开发经验原创 2022-12-01 19:12:11 · 925 阅读 · 0 评论 -
编程 表驱动
https://blog.csdn.net/augfun/article/details/109705241?ops_request_misc=&request_id=&biz_id=102&utm_term=C%E8%AF%AD%E8%A8%80%20if%20else%E5%A4%AA%E5%A4%9A&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-109705241.142v65contro原创 2022-11-18 14:01:40 · 153 阅读 · 0 评论 -
go to 语句需要注意的点 坑
go to 只是跳过中间语句,直接执行p1.go to 语句需要注意的点。就算不执行go to p1;原创 2022-11-16 17:07:00 · 250 阅读 · 0 评论 -
串口一直进空闲中断(并不是空闲就会一直中断) 清中断标志位没用
1.空闲中断是接受数据后出现一个byte的高电平(空闲)状态,就会触发空闲中断.并不是空闲就会一直中断,准确的说应该是上升沿(停止位)后一个byte,如果一直是低电平是不会触发空闲中断的(会触发break中断)。导致主程序无法运行。原创 2022-11-11 14:24:40 · 3012 阅读 · 0 评论 -
防火墙 端口号 出入站规则 这三者之间的联系
防火墙 出入站规则原创 2022-08-03 10:08:45 · 245 阅读 · 0 评论 -
ADC采样率(HZ)是什么怎么计算
低功耗 蓝牙 智能手表原创 2022-07-07 16:56:19 · 12219 阅读 · 0 评论 -
记几个智能手表相关芯片 蓝牙芯片 低功耗
低功耗 蓝牙 智能手表原创 2022-07-01 09:45:20 · 1718 阅读 · 0 评论 -
由于使用flash存放参数时,擦除掉了flash的代码区导致进入硬件错误中断
记录 bug原创 2022-07-01 09:38:42 · 690 阅读 · 0 评论 -
LORA技术---LoRa信号从数据流变为LoRa扩频信号,再从射频信号通过解调变为数据
-LoRa信号从数据流变为LoRa扩频信号,再从射频信号通过解调变为数据原创 2022-06-22 16:15:29 · 905 阅读 · 0 评论 -
模拟串口UART的实现
模拟串口原创 2022-06-21 11:37:23 · 762 阅读 · 0 评论 -
程序中的数字和字符 数字1和字符‘1‘
解迷团数字1 和 字符’1’将他们分别用十六进制表示:数字1 0x1或0x01字符’1’ 字符’1‘的ascii码为 0x49ASCII码字符对照表https://blog.csdn.net/wz947324/article/details/80076496?ops_request_misc=&request_id=&biz_id=102&utm_term=%E5%AD%97%E7%AC%A61%E7%9A%84ascii&utm_medium=dist原创 2022-05-25 19:42:45 · 2031 阅读 · 1 评论 -
原来c++重载的概念这么容易理解 重写和重载
二、重载的作用方法重载的主要好处就是不用为了对不同的参数类型或参数个数,而写多个函数。多个函数用同一个名字,但参数表,即参数的个数或(和)数据类型可以不同,调用的时候,虽然方法名字相同,但根据参数表可以自动调用对应的函数。如果我们使用reflector去查看微软写的.net的基类库的话,我们可以发现他使用很多的方法重载,这样我们在调用的时候,就不需要记那么多的方法名称,而是知道了方法的功能就可以直接的给他传递不同的参数,编译器会明确的知道我们调用了哪一个方法。重载比if…else要优雅,减少了if…e原创 2022-05-24 15:54:06 · 183 阅读 · 0 评论 -
结构体字节对齐问题
结构体字节对齐问题c++字节对齐编译器指令#pragmahttps://blog.csdn.net/weixin_34380296/article/details/93210768?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164932717616780261971273%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&reque原创 2022-04-07 18:27:26 · 199 阅读 · 0 评论 -
while循环和for循环的区别 以及while(1)和for(;;)的运行效率
while循环和for循环的区别for循环适合已知循环次数的操作,while循环适合未知循环次数的操作。另外还有一个do…while…的循环;https://blog.csdn.net/weixin_42495773/article/details/81408950?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164922868116780357239939%2522%252C%2522scm%2522%253A%25222014071原创 2022-04-06 15:08:51 · 1190 阅读 · 0 评论 -
什么时候需要用malloc开辟空间?
通常情况下,我们会定义一个指针,然后让这个指针指向一片内存空间的首地址,然后通过这个指针操作这块内存。两种情况1.指针指向的这块内存空间的大小确定。例如:一个指定大小的数组我们定义好的一个结构体2.指针指向的这块内存的大小不确定。这时候就要用到malloc去在堆上开辟一片空间供我们使用。避免造成踩内存...原创 2022-03-30 23:10:36 · 2022 阅读 · 0 评论 -
第三方库的使用 例 libcurl 如何去使用一个第三方库 下载库 安装库(编译) 在自己的程序中链接库
libcurl库简介libcurl库简介C语言哈希函数库略略C语言必备实用第三方库Melon(包括数据结构算法)C语言必备实用第三方库Melon(包括数据结构算法)著名的C/C++框架和第三方库著名的C/C++框架和第三方库...原创 2022-03-25 10:21:06 · 1912 阅读 · 0 评论 -
删除队列元素的原理 两个思路
删除队列元素的两个思路哪个比较合理?思路二耗时较少,但是队首标志往后移,不就会才内存了吗??思路一才符合实际情况思路一:以数组作为底层数据结构时,一般讲队列实现为循环队列。这是因为队列在顺序存储上的不足:每次从数组头部删除元素(出队)后,需要将头部以后的所有元素往前移动一个位置,这是一个时间复杂度为O(n)的操作:思路二:可能有人说,把队首标志往后移动不就不用移动元素了吗?的确,但那样会造成数组空间的“流失”。我们希望队列的插入与删除操作都是O(1)的时间复杂度,同时不会造成数组空间的浪费,原创 2022-03-24 19:05:59 · 1794 阅读 · 0 评论