
C语言
文章平均质量分 80
HaiQinyanAN
努力才是硬道理!
展开
-
链表【+逆序链表】、循环队列、堆栈讲解(头插法和尾插法)
链表是一种常用的数据结构。相较于数组,链表的好处在于可以动态地分配内存空间,因此可以适应更为灵活的内存需求。数据域和指针域。数据域存储节点的数据,指针域指向下一个节点。将所有的节点连接起来,就形成了一个链表。可以动态地分配内存空间,不受固定大小的限制;插入和删除操作效率高,时间复杂度为O(1);可以轻松地实现栈、队列等数据结构。随机访问不方便,需要遍历整个链表;内存空间占用较大,因为每个节点都需要额外的指针域;不支持快速排序等高级算法。队列是一种特殊的线性表结构,它只允许在队尾。原创 2023-05-31 20:44:52 · 3262 阅读 · 0 评论 -
多线程环境中的共享变量怎么保护起来的(volatile关键字与互斥锁)
在C语言中,使用volatile关键字可以告诉编译器某个变量是易变的,需要每次从内存中读取或写入,而不是对变量进行优化缓存。因为编译器会对变量进行各种优化,比如寄存器优化、指令重排等等,这些优化可能会导致变量的读写顺序出现问题,从而导致程序错误。在多线程编程中,如果一个变量被多个线程同时访问和修改,那么就会出现竞态条件问题,为了避免这种问题的发生,需要使用同步机制来保护共享变量。但是,同步机制仅能确保互斥访问,不能确保变量访问操作的顺序性和完整性。原创 2023-05-29 19:25:10 · 2778 阅读 · 0 评论 -
C语言编写自己的日志系统
在我们自己做项目过程中会用到日志系统来记录程序的信息,这就需要我们自己来完成日志系统。回滚的话暂时没用到,后面用到了在搞搞。原创 2023-04-19 17:15:31 · 2278 阅读 · 0 评论 -
行缓冲、全缓冲、无缓冲以及用户缓冲区、内核缓冲区介绍
可以理解为:内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。后面讲到的内核缓冲区以及用户缓冲区能够更好理解缓冲区的作用。缓冲区其实可以算是保护我们的硬件的,所有的磁盘都是有寿命限制的(读写的次数不是无限的),到了一定的程度就坏了。所以就将我们要读写的内容都放在缓冲区中,统一进行读写,减少次数。缓冲区就是一块内存区,它用在输入输出设备和CPU之间,用来缓存数据。原创 2023-03-06 11:28:56 · 4807 阅读 · 1 评论 -
linux下C语言与GTK3.0实现数据库(sqlite3)课程设计-客户运送(client transportation)
花了大概10天的时间吧,边学边做,前期对GTK根本不了解的,但是照猫画虎还是没问题的。增删改查大概都可以实现的。课程设计涉及到的内容: - 编程语言:C语言 - 图形界面:GTK3.0 - 数据库:sqlite3原创 2023-02-21 22:55:45 · 2435 阅读 · 4 评论 -
C语言中usleep与nanosleep函数讲解以及毫秒级休眠实现
是纳米、纳秒等计量单位的开头字母,一纳秒是10的负9次方秒,是10的负6次方毫秒,是10的负3次方微秒。(后面我们毫秒级的实现也是根据nanosleep函数实现的)这是因为后面讲到的usleep函数中微妙级的实现是根据nanosleep函数实现的。具体实现是根据nanosleep函数实现的,其实我们也可以自己去实现ms的级别运算。可以看见我们函数主要是根据usleep函数实现的,仿照这来写的函数程序。其实说实话我们其实直接可以利用微妙级函数直接实现毫秒级的延迟就行。可以看见5s会有一次显示。原创 2023-01-28 21:27:27 · 12961 阅读 · 0 评论 -
C语言各种查找算法实现(二分查找、三分查找、顺序查找、插值查找、寻找第k小元素)
1- 生成数组(1)手动生成数组(2)自动生成数组2- 判断升降(判断先升后降 先降后升 升序 降序 乱序)3- 顺序查找4- 二分查找(1)二分查找(单调序列)(2)二分查找(先升后降序列)5- 插值查找6- 三分查找(1)三分查找(先升后降)(2)三分查找(单调递增序列)7- 寻找第k小元素(1)预排序查找第k小元素(2)减可变规模查找第k小元素(3)暴力法查找第k小元素原创 2022-12-14 22:55:07 · 1581 阅读 · 0 评论 -
自定义函数获取buf时snprintf中sizeof(buf)出现问题导致赋值不全
directive output truncated writing 16 bytes into a region of size 4 [-Wformat-truncation=]warning: argument to 'sizeof' in 'snprintf' call is the same expression as the destination; did you mean to provide an explicit length? [-Wsizeof-pointer-memaccess]原创 2022-11-13 11:12:35 · 1141 阅读 · 0 评论 -
strtok()与sscanf()函数+变量计数方法使多次到达的一个数据保存在一个buf中
今天遇到了两个比较有意思的函数,可以将字符串分割,在项目中一般用的比较多吧,记录一下,防止只有自己忘记。一般来说都是自定义函数返回的字符串需要分割保存在数据库之类的功能,于是就需要用到这些函数,分割然后保存在不同的buf中,在实现保存之类的。如果是要将数据保存到数据库中,因为数据库中有不同的列,于是需要分别保存进去。上面的两个函数用到之后,就可以将分割的数据直接保存进去啦!这个主要就是将主字符串分成自己想要的部分保存在buf中,然后利用”%*01s“表示的是下一个读到的这一个字符串忽略不要。原创 2022-10-15 09:26:10 · 272 阅读 · 0 评论 -
warning: function returns address of local variable【函数返回首地址出错原因】
这个提示就是告诉我,我定义的这个tmp_data这个是局部变量(在自定义函数里面定义的),不能返回他的地址,返回给主函数地址没用的,因为我这个函数用完就释放啦,你拿着我的地址找不到我的啊!~原创 2022-10-08 16:28:05 · 1305 阅读 · 0 评论 -
void*类型强制转换结构体指针类型
在使用sqlite3的时候,里面有一个回调函数,但是获取数据之后我想要把我获取的数据拿出来,找不到其他的办法。callback函数中的第一个参数就是传参的,这也是我能够想到的唯一切口了。但是他是void类型的,传进来结构体的地址之后,就需要注意了,需要强制类型转换,但是又不能直接转换,需要重新定义一个结构体指针,再进行强制类型转换。还需要注意的就是结构体里面的变量不能赋初始值,默认为0。这样里面的函数将信息传进结构体,外面的函数也可以调用啦!今天遇见一个自己之前不理解的地方,记录一下,教训。原创 2022-10-06 14:27:09 · 4932 阅读 · 0 评论 -
C语言实现sqlite3创建表格,插入数据,查看数据
C语言实现sqlite3创建表格,插入数据,获取数据 sqlite3_open() sqlite3_exec() sqlite3_close()原创 2022-09-24 23:40:03 · 4352 阅读 · 0 评论 -
gcc编译过程
一般在windows下编译代码的时候是直接生成了可执行文件,但是在linux下可以分布进行步步查看到,现在就来讲讲每个过程。原创 2022-09-23 09:16:47 · 6448 阅读 · 0 评论