C语言大杂烩
文章平均质量分 65
分享关于c语言的一些知识点和话题
九月丫
爱好编程,爱好生活
展开
-
timerfd 定时器类函数
这个接口基于文件描述符,通过文件描述符的可读事件进行超时通知,因此可以配合 select/poll/epoll 等使用。0 表示无属性,TFD_NONBLOCK表示设置为非阻塞模式,TFD_CLOEXEC。读事件发生即可读,返回超时次数(从上次调用timerfd_settime()启动开始或上次。new_value.it_value 非零则启动定时器,否则关闭定时器,如果。为0,则定时器只定时一次,即初始那次,否则之后每隔设定时间超时一次。如果成功返回一个定时器的文件描述符,失败返回-1。原创 2023-05-09 19:45:44 · 584 阅读 · 0 评论 -
C语言正则表达式转换相关 API
语言字符串表示则要为"([0-9]{1,3})\\.[0-9]{1,3}\\.[0-9]{1,3}\\.([0-9]{1,3})"。"([0-9]{1,3})\\.[0-9]{1,3}\\.[0-9]{1,3}\\.([0-9]{1,3})"这个正则表达式字符串,'([0-9]{1,3})\.[0-9]{1,3}\.[0-9]{1,3}\.([0-9]{1,3})'表示的正则表达式用。结构体数组首元素里存放的就是匹配的总模式位置,如何后面两个是两个子模式的位置。描述的是匹配到的字符串在原始字符串中的位置。原创 2023-05-09 18:13:19 · 345 阅读 · 0 评论 -
设备驱动控制函数 ioctl函数
该调用传入一个跟设备有关的请求码,系统调用的功能完全取决于请求码。ioctl 命令访问模式(数据传输方向),占据。,分别指示了四种访问模式: 无数据、读数据、写数据、读写数据;是一个专用于设备输入输出操作的系统调用,设备类型,占据 8 bit。通常而言,为了方便会使用宏 _IOC()在内核中,提供了宏接口以生成上述格式的。实现中不检查,通常可以忽略该参数;的数据类型及长度,如果在驱动的。,如果定义了多个 ioctl。交互协议,设备驱动将根据。命令有唯一的设备标识;,在一些文献中翻译为。原创 2023-05-09 18:03:25 · 70 阅读 · 0 评论 -
c 语言 debug 打印调试宏概况
例如DBG_PRINTF(“nihao”),就会被替换为。参数,那么不会发生错误,因为如果没有写##,表示语句所在文件,函数,行号,日期和时间宏。表示语句所在文件,函数,行号,日期和时间宏。系统宏无须头文件即可使用。的作用是为了让宏使用时如果没有指定。那么当程序调用宏没有指定后面的参数时。多了一个逗号,发生错误,加了##写法的作用请观看第二节。就可以避免这种错误,至于。原创 2023-05-09 17:58:35 · 642 阅读 · 0 评论 -
C语言格式化输入输出流函数
sprintf 和 snprintf 函数sprintf 和 snprintf 函数#include<stdio.h>同 printf的原理一样,不过printf是将格式化字符串format输入到stdout输出流中,而 sprintf是将格式化字符串输入到一块字符地址中,snprintf指明了最多能写入多少字节格式化字符串,如果 format长度比size小则全部可以写入str中然后再补上‘\0’,如果format的长度比size大则只保存size-1字节个。原创 2023-05-09 17:56:24 · 49 阅读 · 0 评论 -
C语言宽字符概念及处理 api
宽字符概念宽字符概念宽字符又称多字节字符又称Unicode,在我们在日常写代码的过程中,大部分接触的是ASCII 字符,那么对于字符变量,我们常用的数据类型是char,但是对于中文字符,用char变量就不行了,那么就需要使用宽字符了。也就是说一般的字符是一个字节组成的,如 0x0a,0x38,那么对于普通字符,0x00就可以用来表示字符串结束符,而宽字符通常是由两个字节组成的,例如:0x0061(97)依然是用来表示字符 a,不过它是由两个字节组成,这样一个宽字符最多可表示。原创 2023-05-09 17:42:16 · 1710 阅读 · 2 评论 -
C语言主函数命令行解析 api
带长解析命令参数函数 getopt_long我们经常在执行一些可执行文件或命令时常常会指定一些参数用来指定该命令执行某一些特殊操作,例如,我们执行ls,我们可以在后面加-l或-a,也可以-la,或者一般执行某个命令时都可以加--help来打印一些帮助信息,那么这些都是怎么做到的呢,我们的程序要怎么去处理这些命令选项呢?//用来保存选项的参数extern intoptind;//用来记录下一个检索位置extern intopterr;原创 2023-05-08 23:11:18 · 80 阅读 · 0 评论 -
C语言系统环境类 api
查看环境变量的内容函数 getenv查看环境变量的内容函数 getenv#include<stdlib.h>搜索 name所指向的环境字符串,并返回出相关的内容值包含被请求变量名称的C字符串该函数返回一个以 null结尾的字符串,该字符串为被请求环境变量的值。如果该环境变量不存在,则返回 NULL无。原创 2023-05-08 22:50:50 · 49 阅读 · 0 评论 -
C语言进程退出 api
任何属于该进程的打开的文件描述符都会被关闭,该进程的子进程由父进程继承,初始化,且会向父进程发送一个 SIGCHLD。如果函数成功注册,则该函数返回零,否则返回一个非零值。您可以在任何地方注册你的终止函数,但它会在程序终止的时候被调用。中止程序执行,直接从调用的地方跳出。当程序正常终止时,调用指定的函数。注册进程终止操作函数 atexit。进程异常终止函数 abort。不同的是他不会去做清理工作。在程序终止时被调用的函数指针。返回给父进程的状态值。原创 2023-05-08 22:46:12 · 213 阅读 · 0 评论 -
C语言时间类函数 API
关于时间的系统结构体#include<time.h>关于时间的系统结构体struct tm 结构体这是一个用来保存时间和日期的结构。相关函数 API生成时间函数 time返回自纪元 Epoch)起经过的时间,以秒为单位。如果tloc不为空,则返回值也存储在变量 tloc中保存自纪元Epoch)起经过的时间值的指针,一般为NULL。自纪元 Epoch)起经过的时间,以秒为单位无计时函数 clock该函数可以返回从这个进程开始到调用这个函数的 CPU时钟计时单元 (原创 2023-05-06 09:02:18 · 171 阅读 · 0 评论 -
C 语言随机数 API
只要用户或第三方不设置随机种子,那么在默认情况下随机种子来自系统时钟。如果想在一个程序中生成随机数序列,需要至多在生成随机数之前设置一次随机种子。计算机并不能产生真正的随机数,而是已经编写好的一些无规则排列的数字存储在电脑里,把这些数字划分为若干相等的 N。是一个常量,它的默认值在不同的实现中会有所不同,但是值至少是 32767。返回的伪随机整数序列的种子。通过使用相同的种子值调用 srand()函数获取这个编号,然后 rand(),那么生成这些随机数序列是可重复的。份,并为每份加上一个编号用。原创 2023-05-06 09:02:36 · 90 阅读 · 0 评论 -
C语言地址内存处理相关 API
能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。该函数返回一个指向匹配字节的指针,如果在给定的内存区域未出现字符,则返回NULL。在共享内容更改之后,使得文件的其他映射失效,从而使得共享该文件的其他进程去重新获取最新值。因为文件的读写操作没有内存的读写操作来的方便,所以 mmap()对应射区域的写入数据会复制回文件内,而且允许其他映射该文件的进程共享,对映射区域的写入操作会产生一个映射文件的复制,即私人的"将映射区域锁定住,这表示该区域不会被置换(swap)原创 2023-05-06 09:02:53 · 129 阅读 · 0 评论 -
C语言字符串处理函数汇总
字符串拷贝函数#include<string.h>字符串拷贝函数strcpy 函数把 src所指向的字符串复制到dest。该函数返回一个指向最终的目标字符串 dest的指针。如果目标数组 dest不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况strncpy 函数把src所指向的字符串复制到dest,最多复制n个字符。该函数返回最终复制的字符串。当 src的长度小于n时,dest的剩余部分将用空字节填充strdup 函数strdup()会先用。原创 2023-05-06 09:01:51 · 51 阅读 · 0 评论 -
C语言常用数学函数概叙
使用数学函数不仅要包含头文件还需要链接数学库文件 libm.so。自然对数函数(基数为 e)常用对数函数(基数为 10)原创 2023-05-05 14:46:51 · 112 阅读 · 0 评论 -
输入输出流函数介绍
功能一样,读取输入流缓冲区的字符,不过你输入时它不会显示在屏幕上,而且不需要按回车,可以输入其他类型的数值,而且返回值是表示输入的个数,且不能接受空格,而 gets()可从终端的输入流上获得一个字符的 ASCII 码值,通常可以用来清除缓冲区或回车符。gets 不带溢出检测,也就是我输入的字符数量要是大于。则只能从缓冲区获取字符串,且返回值为该字符串的指针,可以接受空格。不同的是你输入时它会显示在屏幕上,也不需要按回车。能接受的范围将产生段错误,所以在 linux。功能一样,读取输入流缓冲区的字符,和。原创 2023-05-05 14:36:16 · 74 阅读 · 0 评论 -
浮点数的存储方式
整形,字符型的存储方式我们都知道都是以科学计数法的二进制的方式存储,负数是以补码(的方式保存,转换的话也很简单,那么浮点数包含了小数部分和整数部分又是如何去进行存储的呢?要知道什么是指数部分,什么是尾数部分,我们就要对浮点数进行拆解了,例如,对。其中单精度浮点型采用最高位为符号位,接着后 8。8.25 进行拆解,变成什么样子呢,要用二进制的科学计数法变成。符号位我们知道,那什么是指数位和尾数位呢?而对于双精度浮点型算法一样,只不过中间数为。双精度的最高位表示符号位,接着后。原创 2023-05-05 11:42:01 · 211 阅读 · 0 评论 -
联合体和枚举话题
那有人说枚举有大小,是不是会和枚举体内的枚举个数有关呀,其实没有关系的,枚举体中的枚举仅仅只是一个常数而已,不会占空间。显然这个结果并不是我们的预期,为什么会这样呢,因为联合体和结构体一样在大小的规则中也要遵循是最大基础变量字节的整数倍。字节,这下我们应该差不多知道枚举的字节大小是怎么回事了吧,那有人说,如果枚举值超过 8。上面联合体的大小如果没有内存对其的话大小应该是。我们一般定义简单的枚举的时候它的大小是多少呢?我们发现枚举 ONT_1。这时编译系统就会报警告了。才对,可是真的是吗?原创 2023-05-05 11:35:14 · 35 阅读 · 0 评论 -
结构体话题(struct)
所以程序中如果确定了零长数组的个数就可以使用 malloc分配 结构体字节大小+(零长数组成员个数零长数组成员大小)来为达到程序目的,例如,上面的结构体如果表示一个人在一局游戏中的人头统计的话,name表示玩家名称,num表示击杀玩家个数,arg表示被击杀的玩家信息。因为每局游戏都会遇到不同的玩家,击杀的数目也不一样,所以对于这种编译前不确定的东西我们用零长数组来解决,当结果出来的时候我们就可以知道 num的值,任何就可以分配出合理的内存来存放我们需要的信息,这就是零长数组的妙用。原创 2023-05-05 11:16:36 · 51 阅读 · 0 评论 -
.内存泄露检测工具-AddressSanitzer
ASAN 早先是 LLVM 中的特性,后被加入 gcc4.8,成为 gcc 的一部分,但不支持符号信息,无法显示出问题的函数和行数。一般后台程序为保证稳定性,不能遇到错误就简单退出,而是继续运行,采用该选项支持内存出错之后程序继续运行,需要叠加ASAN_OPTIONS=halt_on_error=0 才会生效;不过想要注意的是如果发生错误的程序在动态库文件中,那么通过上面的方式就无法定位具体行数了,那怎么找到着个泄漏点呢?选项后的结果,可以看到告知了我们泄漏内存分配的地方和使用的地方。原创 2023-05-05 10:57:41 · 698 阅读 · 0 评论 -
内存泄露检测工具-Valgrind
比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。发现红框中文本会告诉我们在第几行发生了内存泄漏,非常好用。是生成供调试用的可执行文件,可以在gdb 中运行。是否检测控制范围之外的泄漏,比如全局指针、这时候就会在本级目录出现一个。接着我们编译代码的时候加上。显示具体代码中泄漏的地方。功能,默认就是这个工具。static指针等(原创 2023-05-05 10:58:47 · 83 阅读 · 0 评论 -
内存检测函数-mtrace,muntrace
这个函数的错误用法会导致程序出现内存泄漏,那么就可以使用这个方法来检测内存释放泄漏,其中 setenv(“MALLOC_TRACE”,”output”,1)表示释放内存,但从文件中得知程序一直在申请内存,却没有释放内存,由此可以知道存在内存泄漏。当然,setenv(“MALLOC_TRACE”,”output”,1)一般来说要检测哪一段代码是否有内存泄露,就可以用这一对函数包起来。命令来配置环境了,例如,在执行程序前使用。如图,+号表示系统正在分配内存,文件用来保存内存检测的内容,的文件用来保存检测信息。原创 2023-05-05 10:58:58 · 197 阅读 · 0 评论 -
检查内存泄漏基础方法
通过这样的工具,就能很清晰的观察当前内存的状态。这一列的情况,这一列表示可用内存的大小。如果存在内存泄漏,那么会看到这一个字段的值会一直减少,但是,在泄漏的内存不够多的时候是很难看出来的。如图,红框对应得字段是可用内存的大小,也可以进行判断它的持续减小来发现程序中存在内存泄漏问题。下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于 Windows。开发的程序员其实在检查内存泄漏的问题上可以使用Visual C++的。释放内存的数量是一样的,所以我们可以在写完代码后对代码进行检查,原创 2023-05-05 10:58:30 · 418 阅读 · 0 评论 -
内存怎么泄漏了?
函数返回了一段申请的空间地址,但是调用者没有正确使用指针去接受它,导致空间泄漏,所以应该始终正确处理返回动态分配的内存引用的函数返回值。内存泄漏是很难避免的,不管是老手还是新手,都存在这个问题,甚至 Windows与 Linux。那么子成员所申请的空间将泄漏,所以在对结构体做资源释放的时候应该遍历看各指针成员是否被释放。当定义一个结构体时,为结构体里面的子成员申请空间后,先释放结构体指针,这类系统软件也或多或少存在着内存泄漏。这样每个申请的指针便不能指向其他位置了。造成内存泄漏的最关键。原创 2023-05-05 10:57:01 · 40 阅读 · 0 评论 -
c 语言动态内存分配话题(malloc,calloc,realloc)
2)如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一 要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的。如果调用成功,不管当前内存段后面的空闲空间是否满足要求,都会释放掉原来的指针,重新返回一个指针,虽然返回的指针有可能和原来的指针一样,即不能再次释放掉原来的指针。重新分配的空间如果小于原来的空间,只有重新分配空间大小的数据会被保存,可能会发生数据丢失,慎重使用。3)如果申请失败,将返回 NULL,此时,原来的指针仍然有效。的空间返回返回空间的地址。原创 2023-05-04 19:14:08 · 52 阅读 · 2 评论 -
C语言可变参数设计
在了解可变函数参数之前,我们先来了解一下函数形参地址,我们来看下面一段。可变参数设计(va_list , va_start ,va_arg, va_end )可变参数的地址是绝对连续的,且地址是从左到右依次变高的,这是和已知参数。但是,系统也不一定完全按这样的规律去执行的,例如参数为。就是让指针指向传递过来的下一个参数,也就能明白为什么。得到结论:可以发现函数形参的地址是连续的。等函数就是可变参数函数,他们的参数。就是一个地址指针,用来指向形参的地址。的倍数,所以用来字节对齐,可以看出。原创 2023-05-04 17:51:40 · 80 阅读 · 0 评论 -
c 语言的错误处理(errno.h)
C 语言提供了 perror() 和 strerror() 函数来显示与 errno 相关的文本消息。输出结果和前面方式一样,不过更能体现程序的意义。strerror():根据错误号打印错误信息。原创 2023-05-04 16:40:51 · 764 阅读 · 0 评论 -
volatile
反之如果你不是对此端口反复写操作,而是反复 读操作,其结果是一样的,编译器在优化后,也许你的代码对此地址的读操作只做了 一次。上面的代码讲述了 Exit_Rm 是退出函数,提高检测 i 的值来判断是否执行,但是 i 是通过另外一个线程 fun()去改变的,如果不将 i 用 volatile 修饰的话,可能会只执 行一次对从 i 到某寄存器的读操作,然后每次 if 判断都只使用这个寄存器里面的“i 副 本”,导致 Exit_Rm 永远也不会被调用。它是 volatile 因为它可能被意想不到地改变。原创 2023-05-04 16:33:25 · 53 阅读 · 0 评论 -
restrict
restrict 是 c99 标准引入的,它只可以用于限定和约束指针,并表明所修饰的指针 是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内 存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修 改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.如 int *restrict ptr, ptr 指向的内存单元只能被 ptr 访问到,任何同样指向这个 内存单元的其他指针都是未定义的,直白点就是无效指针。但是这样的作用到底是什么呢?原创 2023-05-04 16:23:42 · 68 阅读 · 0 评论 -
register关键字你知道吗?
由于寄存器的数量有限,而且某些寄存器只能接受特定类型的数据(如指针和浮点数),因此真正起作用的 register 修饰符的数目和类型都依赖于运行程序的机 器,而任何多余的 register 修饰符都将被编译程序所忽略。3. 早期的 C 编译程序不会把变量保存在寄存器中,除非你命令它这样做,这时 register 修饰符是 C 语言的一种很有价值的补充。然而,随着编译程序设计技术的进 步,在决定那些变量应该被存到寄存器中时,现在的 C 编译环境能比程序员做出更好 的决定。注 意是尽可能,不是绝对。原创 2023-05-04 16:16:12 · 96 阅读 · 0 评论 -
typedef你知道吗?
一般 U 表示是无符号的,L 是长,S 是短,32 表示位数,例如 32 位表示整形等同于 RM_FUN 可以表示一个返回值为 int*,参数为 int*,double,unsigned char*的 一个函数指针,这样就能直接用 RM_FUN 来定义这样的函数指针了。RM_FUN p,q;int a;int b;char d;double e;}RM_ADC;这样就可以使用 RM_ADC 来定义结构体了。原创 2023-05-04 16:08:03 · 103 阅读 · 1 评论 -
#define小结
这样就能避免警告第二种情况{fun1();fun2();fun();do{fun1();fun2();}while(0)原创 2023-05-04 16:01:32 · 98 阅读 · 1 评论 -
谈谈scanf的一些小用法
使用scanf可以指定读取输入字符的个数,例如:scanf(“%3d”,&n),当输入 12345 时,因为指定读取 3 位,所以 n=123 scanf(“%5s”,str),输入 nihaoya,str 要只会读取 nihao。原创 2023-05-04 15:21:58 · 139 阅读 · 1 评论 -
Printf带了点颜色
printf是c语言中常用的打印函数,可以使用转义符\加上033对打印的字体进行属性控制,如下给printf增加属性31和5,对应的是字体红色和闪烁,那么打印出来的内容就是闪烁的红色字体,如下图需要注意的是,设置了属性要及时的使用0m关闭属性,不然后面所有的输出内容都会按照设置的属性去显示。原创 2023-05-04 15:03:14 · 135 阅读 · 1 评论