C语言
文章平均质量分 90
咖喱年糕
欢迎大家,和我一起探讨学术上的知识,一起学习一起进步!
展开
-
按位运算符、逻辑运算符
操作的基本形式是使用一个掩码,其中掩码的每个位都是希望设置为 1 的位,其余位设为 0。操作的基本形式是使用一个掩码,其中掩码的每个位都是希望保留的位,其余位设为 0。“条件非” 表达式的含义是,当给定的条件为假(False)时,整个表达式的结果为真(True),反之亦然。“条件或” 表达式的含义是,当至少一个条件为真(True)时,整个表达式的结果就为真。):将一个数的二进制表示向右移动指定的位数,左侧空出的位用原先最高位的值填充(有符号数用符号位填充,无符号数用 0 填充)。原创 2023-11-15 19:42:25 · 205 阅读 · 0 评论 -
【单链表反转】图文解析 链表反转
例题描述思路代码实现例题描述反转一个链表示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL原创 2024-02-19 09:22:29 · 1266 阅读 · 0 评论 -
【C语言】关键字
由ANSI标准定义的C语言关键字共32个:首先,,这是C90标准定义的关键字个数。其实后续的标准又新增了5个关键字,但是由于目前主流的编译器对C99的支持并不是特别好,所以我们默认是C90标准定义的关键字,即32个。一、关键字的分类1、基本数据类型:signedunsignedcharintfloatdoubleshort longvoid2、构造数据类型:structunionenum3、数据存储类别:autostaticexternregister4、数据优化:const。原创 2024-01-09 09:38:00 · 1459 阅读 · 0 评论 -
【C语言】指针——从底层原理到应用
如果问C语言中最重要、威力最大的概念是什么,答案必将是指针!威力大,意味着使用方便、高效,同时也意味着语法复杂、容易出错。指针用的好,可以极大的提高代码执行效率、节约系统资源;如果用的不好,程序中将会充满陷阱、漏洞。这篇文章,我们就来聊聊指针。从最底层的内存存储空间开始,一直到应用层的各种指针使用技巧,循序渐进、抽丝剥茧,以最直白的语言进行讲解,让你一次看过瘾。说明:为了方便讲解和理解,文中配图的内存空间的地址是随便写的,在实际计算机中是要遵循地址对齐方式的。原创 2024-01-08 07:48:07 · 1639 阅读 · 0 评论 -
【C语言】段错误、内存溢出、内存泄漏(区别)、堆溢出、栈溢出
为了判断内存泄漏,我们可以使用linux下的内存泄漏检查工具来判断内存是否泄漏,除此之外,我们可以在写代码时添加内存申请和释放的统计功能,来统计当前申请和释放的内存是否一致,从而来判断内存是否泄漏。内存泄漏并非指内存在物理意义上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。当基类指针指向派生类的对象时,如果基类的析构函数不是虚函数,那么子类的析构函数将不会被调用,子类的资源没有被正确释放掉,因此造成内存泄漏。(4)使用的第三方软件中的bug。原创 2024-01-08 01:36:57 · 1115 阅读 · 0 评论 -
【C语言】静动态内存的跨函数访问malloc、free
如果你的程序使用了动态分配的内存,确保在不再需要这些内存块时释放它们。具体到这个 f( ) 函数就是 ,变量 q 没了,变量 i 没了, i 的值 10 也没有了。之后,被释放的内存块不再属于程序,因此在后续的代码中尽量避免使用已经释放的内存。那么main 函数 就不能访问 i 的值,也就是 printf("%d\n",*p) 中的 *p 逻辑上是不可以的。通俗说就是:当被调用的函数结束后,被调用函数里面的静态内存不能被其他函数访问。这个程序运行是能正常输出的,但是程序是错误的,逻辑上有错误。原创 2024-01-06 07:41:39 · 871 阅读 · 0 评论 -
【C语言】自己代码实现字符串相关的常用API
【C语言】自己代码实现字符串相关的常用API原创 2024-01-06 06:56:13 · 470 阅读 · 0 评论 -
【C语言】计算机原码,反码,补码
一个数在计算机中的表现形式叫做机器数,这个数有正负之分,在计算机中用一个数的最高位(符号位)用来表示它的正负,其中0表示正数,1表示负数。例如正数7,在计算机中用一个8位的二进制数来表示,是00000111,而负数-7,则用10000111表示,这里的00000111和10000111是机器数。原创 2024-01-05 08:43:34 · 792 阅读 · 0 评论 -
【C语言】结构体对齐计算方式
第二个成员ch2,ch2的偏移量是前面成员的大小和(这个大小和是遵循第一法则的前提下的大小和,不是随意加起来就行的),所以ch2的偏移量为1,1满足ch2的大小1的整数倍,所以到ch2这里大小为1+1 = 2;首先,第一个成员ch1 的偏移量为0(可以这么理解 距离结构体头距离为0),ch1的类型为char,大小为1字节,0被认为是任何数的整数倍,所以到ch1这里大小为1;这个demo计算到int i的时候为8,8直接加上数组大小32为40,40正好是4的整数倍,所以demo的大小就为40。原创 2024-01-05 07:17:21 · 882 阅读 · 0 评论 -
【预处理命令】
否则在多次引入时会引起重复定义错误)#define(宏定义命令)格式:#define 标识符 字符串并不是所有情况下#define所定义的字符串都会被替换,有一种特殊情况:被替换的字符串在""内。原创 2023-12-12 20:53:39 · 55 阅读 · 0 评论 -
常用的调试方法(段错误产生原因)
C 语言中常用的调试技巧和 demoC语言中常用的调试方法打印调试信息GDB 调试器编写单元测试段错误产生原因初学时两种常用的段错误调试方法当程序员进行调试时,他们通常会使用一些调试语句或技巧来帮助他们理解代码的执行过程以及识别问题。以下是一些在 C 语言中常用的调试技巧和 demo:2. 使用 进行断言3. 使用 进行命令行调试在 GDB 中可以使用诸如 , , , , 等命令进行调试。5. 使用 和宏定义进行条件编译6. 手动触发程序崩溃7. 使用 打印错误信息原创 2023-12-11 10:28:13 · 470 阅读 · 0 评论 -
【线程池】的原理分析及源码(C语言版)
**任务结构体 *//// 泛型,兼容各种各样的数据类型void *arg;} Task;/** 线程池的结构体*//** 任务队列*/// 容量// 当前任务个数// 队头// 对尾// 管理者线程ID// 工作的线程IDint minNum;// 最小的线程数int maxNum;// 最大的线程数// 正在工作的线程// 存活的线程个数// 要销毁的线程个数///< 锁整个线程池///< 锁busyNum变量///< 任务队列是不是满了。原创 2023-12-11 10:09:23 · 329 阅读 · 0 评论