自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(75)
  • 收藏
  • 关注

原创 关于 typedef 的用法

我们可以将复杂的类型定义封装在一个简单的别名中,以提高代码的可读性和可维护性。它可以简化复杂类型的声明、定义和使用,并且在进行类型更改时,只需要修改一处。是 C 和 C++ 语言中的关键字,用于创建类型的别名。它的主要作用是给一个已有的类型定义一个新的名称,以提高代码的可读性和可维护性。这里的声明方式直接指定了函数指针变量的类型,其中。是我们定义的一个别名,代表了函数指针类型。的函数指针类型,该函数指针指向一个返回类型为。是函数指针所指向的函数的参数列表,而。是函数指针所指向的函数的返回类型。

2023-11-29 16:46:51 172

原创 关于 Makefile 文件中 CC 和 CFLAGS等编译选项的正确用法

作为一个小菜鸟,之前一直误会了 CC 和 CFLAGS 的用法,在这里马克一下正确用法。就会自动按设置的执行,即便不加那两句代码。这个是多余的,因为设置了。

2023-11-29 10:36:48 929

原创 无名管道和有名管道

无名管道(Unnamed Pipe)是一种在进程间进行的机制。它可以用于,或者。无名管道是,它没有与之关联的文件名,。通过无名管道,。无名管道,并且。通过这种方式,进程可以安全地在彼此之间传递数据,实现简单的进程间通信。是的,管道是一个先进先出的字节流,读取数据时会从管道中消耗数据,导致剩余数据减少。当你使用read函数从管道中读取数据时,数据会被移出管道,并可以在读取缓冲区中使用。读取操作会将读取的数据从管道中移除,所以管道中的数据量会减少。相反,当你使用write。

2023-10-13 18:43:08 331

原创 利用互斥锁实现多个线程写一个文件

在这个代码中,是需要加入 pthread_cancel() 函数的因为:线程函数wrfunc1、wrfunc2和wrfunc3都包含一个无限循环,循环内部没有明确的退出条件。没有明确的退出条件意味着线程函数会一直执行下去,直到程序结束或者发生了某个特殊的情况导致线程被强制终止。在这种情况下,如果没有使用pthread_cancel,线程将一直运行下去,不会自动退出。这个代码中的 sleep(100) 是必须加入的,如果不加入那么 线程 2 和 线程 3 将没有机会执行,也就看不到正确的结果。

2023-10-09 14:01:47 656

原创 不能对 void 类型的变量进行解引用等

类型本身是无类型的,编译器无法确定它具体指向的是什么类型的数据。是C语言中的通用指针类型,可以存储任意类型的指针。这样的声明,那么不能通过。来解引用获取所指向的。

2023-10-04 22:23:31 276

原创 进程创建时自动打开的三个文件描述符

它是进程输出错误信息的通道。通常情况下,它也连接到显示器或者其他输出设备。通过将错误信息写入标准错误,进程可以将错误信息单独输出,与标准输出区分开来。:它是进程输出数据的通道。通常情况下,它连接到显示器或者其他输出设备。通过向标准输出写入数据,进程可以向用户显示信息或者将处理结果输出到显示设备。:它是进程接收输入的通道。通常情况下,它连接到键盘或者其他输入设备。通过读取标准输入,进程可以获取用户输入数据。这三个文件描述符在进程启动时会自动关联到适当的文件或设备上。

2023-10-02 22:11:36 400

原创 init进程 和 终端进程的关系

在 Linux 中是用户与系统交互的一个重要渠道。当你登录到 Linux 系统时,通常会通过终端(例如命令行终端、虚拟终端等)来与系统进行交互。终端进程负责接收用户输入的命令,并将其传递给相应的进程进行处理和执行。它会根据系统的运行级别(runlevel)来启动相应的系统服务和进程。尽管终端进程和 init 进程有不同的职责,但它们之间存在联系。实际上,Linux 的 init 进程和终端进程。在 Linux 系统中,

2023-10-02 21:04:51 209

原创 kill -9 的用法

命令会立即终止目标进程,而不给进程任何机会保存数据或执行清理操作。这是一种非常强硬的终止方式,应该谨慎使用。并按下回车后,系统会发送一个强制终止信号给指定进程的进程 ID(PID),以立即终止该进程。命令或其他方式查找到进程的 PID。请注意,只有在你具有足够的权限时才能终止其他用户的进程(只有在无法正常终止进程,或者需要立即停止一个非响应的进程时,才考虑使用。是一个 Linux 命令,用于强制终止一个进程。为实际要终止的进程的进程 ID。通常情况下,我们应该首先尝试使用。命令发送默认的终止信号给进程,

2023-10-01 20:51:01 14226

原创 静态库和动态库

当你在做一道菜的时候,你需要用到一些材料来完成。静态库就好像是你事先准备好的所有材料,你把这些材料都放在自己的厨房里,需要的时候直接从自己的材料库里取出来使用。因为材料是你自己的,你可以随意修改它们,但是会占用更多的空间。而动态库就好像你和你的邻居共享一个大材料库。你们可以一起使用这个材料库,节省了空间和资源。当你做菜的时候,你只需要从共享材料库中取出你需要的材料,用完之后就放回去供其他人使用。这样多个人可以共享同一份材料,减少了重复使用和浪费,但是你无法修改材料本身,只能使用它们。

2023-10-01 13:15:52 132

原创 c语言 - 实现每隔1秒向文件中写入当前系统时间

主要是通过库函数和结构体获取当前系统时间(年月日和时分秒)保存到变量里,然后通过格式化输出函数将当前系统时间输出到文件中去。但是需要注意的是题目要求每隔 1 s对系统时间进行输出,所以需要加入 sleep()函数进行调整 ,而且如果加入 sleep() 函数还想要输出数据到文件中的话是必须要在每一次输出数据后刷新缓冲区的。

2023-09-28 22:03:18 1004

原创 使用 fflush强制刷新缓冲区将数据写入文件的原理

当你在 C 语言中使用标准 I/O 函数(如fprintffwrite等)向文件进行输出时,数据通常不会立即写入文件,而是。缓冲区是一个临时存储区域,其目的是通过将多个输出操作合并成一个较大的写操作,从而提高效率。当你使用标准 I/O 函数进行输出时,数据会首先被写入缓冲区,而非直接写入文件。\nfflushfflush对于输出流,将缓冲区中的数据立即写入相关的文件,并清空缓冲区。这意味着在调用fflush之后,数据将立即写入到文件中。

2023-09-28 21:59:08 406

原创 二进制文件和文本文件

如 MP4、AVI、MKV 等常见的视频文件也属于二进制文件,它们以二进制形式存储了视频的像素数据、音频数据以及其他视频属性信息。:数据库文件也是一种二进制文件,它们以特定的二进制格式存储了结构化数据,用于在数据库管理系统中进行数据的持久化存储和访问。:如 MP3、WAV、FLAC 等音频文件也是二进制文件,它们以二进制格式存储了音频数据以及相关的音频属性信息。这些只是一些常见的例子,实际上,几乎任何类型的文件都可以是二进制文件,只要它们以二进制形式存储数据。

2023-09-27 21:32:32 1169

原创 man 的帮助手册页

表示查看系统调用(System Calls)的帮助手册页。系统调用是操作系统提供给应用程序的一组接口,用于访问操作系统提供的底层功能和资源。表示查看 C 标准库(C Library)的帮助手册页。C 标准库包含了用于实现常见操作和功能的预定义函数的集合。请注意,实际可用的帮助手册页取决于系统和已安装的软件包。命令可以让你查看不同类型的帮助手册页,帮助你了解系统调用、库函数和其他相关的系统文档。命令时,后面通常会跟着一个数字参数,指定要查看的帮助手册页的类型。命令用于显示系统的帮助手册页。

2023-09-24 13:30:59 115

原创 销毁一个任何类型的队列或者栈等

其实就是看 malloc 的什么,然后就 free 什么,不能偷懒。比如 malloc 了多个链表节点,那么到最后也要 free 多个链表节点。

2023-09-22 23:16:58 60

原创 数据结构 - 链表

将线性表 L = (a, a, … , a)中各元素分布在存储器的不同存储块,成为结点,通过地址或指针建立元素之间的联系。,而。下图中的首元结点(头结点) A 的最后一个结点的 next 域,也就是下图中最后一个结点的那个。

2023-09-22 13:53:35 253 1

原创 数据结构 - 线性表(顺序表)

线性表是包含若干数据元素的一个线性序列,记为: L = (a,…a,a,a,…a线性表L可用二元组形式描述():L = (D,R)即线性表 L 包含数据元素集合 D 和关系集合 RD = {a| aR = {<a, a> | a,a。

2023-09-22 11:26:59 587

原创 如何实现让一个函数能返回多个值的效果

在C语言中,一个函数通常只能返回一个值。但是可以通过指针参数或结构体来模拟返回多个值的效果。

2023-09-13 22:03:24 386 1

原创 数据结构 -作用及基本概念

数据结构包括数据的逻辑结构和存储结构及其操作。逻辑结构(Logical Structure):逻辑结构描述了数据元素之间的关系和组织方式,它独立于计算机的存储方式。常见的逻辑结构包括以下几种:线性结构:数据元素之间存在一对一的关系,例如线性表、栈、队列等。非线性结构:数据元素之间存在一对多或多对多的关系,例如树、图等。集合结构:数据元素之间没有关系,它们是独立存在的。文件结构:数据元素按照某种逻辑关系组织起来,例如数据库中的表格。

2023-09-03 17:53:32 933

原创 GDB调试

以下是一些在 Linux 中使用 gdb 进行调试时常用的基本命令(:启动 gdb 调试器,并指定要调试的可执行文件。run或r:运行程序。或:在指定的位置设置断点,可以是函数名、行号或文件名。continue或c:继续执行程序,直到下一个断点或程序结束。next或n:执行下一行代码,。step或s:执行下一行代码,。或:打印变量的值。:显示当前上下文的局部变量。backtrace或bt:显示函数调用堆栈。quit或q:退出 gdb 调试器。list或l:显示当前位置附近的源代码。:设置变量的值。

2023-09-03 10:55:53 175

原创 gcc -L和 gcc -I的区别

选项在作用和使用上有所不同,分别用于指定库文件搜索路径和头文件搜索路径,用于链接和编译过程中的不同阶段。选项用于链接过程,表示指定链接器(ld)搜索库文件的路径。它告诉链接器在指定的目录中搜索所需的库文件。选项用于编译过程,表示指定编译器搜索头文件的路径。它告诉编译器在指定的目录中搜索所需的头文件。是两个不同的选项,用于在链接和编译过程中指定不同的路径。这个命令告诉链接器在。这个命令告诉编译器在。

2023-09-01 18:56:34 466

原创 C语言 - 程序的分文件编写

C语言程序可以通过分文件编写来提高代码的结构性和可维护性。下面是一个简单的示例,展示了C语言程序如何分文件编写:创建多个源文件:将程序的不同部分分别写在不同的源文件中,每个文件包含一个或多个相关的函数。比如,可以创建一个名为main.c的源文件,用于包含主函数,以及一个名为的源文件,用于包含计算相关的函数。创建头文件:对于每个源文件,可以创建一个相应的头文件(以.h为后缀)。头文件中通常包含类型定义、函数声明、宏定义等。比如,在文件中定义了一个计算函数,则可以在头文件中声明该函数。

2023-08-30 11:23:15 1634

原创 C语言 - 结构体、结构体数组、结构体指针和结构体嵌套

正式:结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据被称为结构型数据的 “成员” ,其描述了一块内存区间的大小及解释意义。通俗:结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。在C语言中,定义结构体的语法格式struct 结构体名 {类型 成员1;类型 成员2;// ...其中,结构体名是您自定义的结构体类型名称,可以根据需求进行命名。成员1成员2等表示结构体的成员变量,每个成员都有自己的类型和名称。

2023-08-29 13:10:40 1760

原创 Linux里编译 C语言小技巧

g 来代替 gcc xxx -Wall。

2023-08-28 19:34:05 50

原创 不能直接把字符串赋值给字符数组

在C语言中,使用赋值操作符直接将字符串赋值给字符数组是一种特殊的用法。当使用赋值操作符将字符串赋值给字符数组时,编译器会自动将字符串的字符逐个拷贝到字符数组中,并在最后自动添加一个空字符(\0)作为字符串的结束符。例如,您提到的这种写法是合法的,它将字符串"hello"的内容逐个拷贝到长度为 10 的字符数组name中,并在数组末尾添加了一个空字符。

2023-08-28 19:00:08 1939

原创 Shell脚本 - $@和$*的区别

【代码】Shell脚本 - $@和$*的区别。

2023-08-27 22:38:40 422

原创 Linux Shell 搜索命令 grep

是一个强大的文本搜索工具,用于在文件或标准输入中查找匹配指定模式的行。是要被搜索的文件,如果不指定文件,则默认从标准输入中读取数据。是要搜索的模式,可以是普通字符串或使用正则表达式表示的模式。

2023-08-26 08:48:39 1412

原创 Linux Shell 如何列举当前目录下的文件夹

那么就使用ls -d */命令,因为 文件夹的名称都是以 / 结尾的。

2023-08-26 08:38:48 454

原创 嵌入式学习-c语言字符串处理函数

,那么只需要用strrchr函数即可,即在中间加一个’r’。

2023-08-24 18:36:01 172

原创 C语言 - memset函数

函数操作的是字节级别的内存,所以它通常用于处理字符数组、整型数组或其他基本数据类型的内存块。它不适用于结构体或动态分配的内存等复杂情况。在这些情况下,应该使用适当的赋值操作来设置内存的值。它可以用于在一段内存中快速设置某个特定字节的值。例如,将一个字符数组中的所有元素设置为0,可以使用。是C语言中的一个函数,用于将一块内存区域的值设置为特定的字节。用于指定要设置的字节数,以确保涵盖整个数组。中的所有元素设置为0,即将整个数组清零。

2023-08-24 18:30:27 2392

原创 c语言 - inline关键字(内联函数)

在编程中,inline是一个关键字,用于修饰函数。inline函数是一种对编译器的提示,表示这个函数在编译时应该进行内联展开。内联展开是指将函数的代码插入到调用该函数的地方,而不是通过函数调用的方式执行。这样可以减少函数调用的开销,提高代码的执行效率。使用inline关键字修饰函数并不保证函数一定会被内联展开,它只是向编译器提供了一个建议。编译器会根据自身的策略来决定是否对函数进行内联展开,通常会考虑函数的复杂性、调用频率等因素。需要注意的是,过度使用inline关键字可能导致可执行文件的体积增大。

2023-08-24 13:29:59 800

原创 C语言题目 - 调用qsort函数对数组进行排序

如题。

2023-08-23 13:59:09 1217

原创 C语言题目 - 利用函数和指针实现任意整数转换成字符串

如题。

2023-08-21 20:38:19 240

原创 C语言 - 关于循环给数组赋值不赋满剩余空位值的情况

假如有数组char str[12] , 如果循环给它赋5个值的话,那数组中剩下的空位都是几?

2023-08-21 19:36:02 530

原创 C语言 - 关于数字和字符的转化

如果想要 2 转换为 ‘2’ 则需要进行 2 +?= 50 的转换 这里?是48 ,也就是 ‘0’,所以 2 + ‘0’ = ‘2’ ,同理 3 + ‘0’ = ‘3’ , 4 + ’0‘ = ’4‘第二列和第四列分别代表ASCII码值和相应的字符,可以看出字符的‘0‘ - ’9‘ ASCII码值是 48 - 57。

2023-08-21 19:30:28 127

原创 C语言题目 - 使用指针实现删除字符串中的空格

编写一个函数并利用指针删除字符串中的空格。

2023-08-21 01:17:24 515

原创 C语言题目 - 编写一个函数实现一维数组求和

如题主要是通过在 main() 函数最中将定义好的数组传入求和函数中并调用该函数对该数组元素进行求和输出结果:可以看出上述代码只打印数组的第一个元素,并且和为1,说明循环只进行了一次。这是为什么呢?后来打印出 sizeof(data) / sizeof(int) 的值为1,因为:在定义形参时出现了错误,此时拿出宝典翻一下:如果不知道形参和实参是否匹配,可以把形参放等号左边,实参放等号右边,也就是把实参赋值给形参,而这里是 int data[] = b,这肯定是不对的,因为等号左边是一个数组定义,而等号

2023-08-20 15:50:32 2054

原创 C语言 - 关于sizeof()在数组中的使用误区

因为数组 b 在定义时就指定了长度为 5 ,虽然只在后面初始化了三个元素,但根据C语言的规则,未显式初始化的数组元素将被设置为0。这样的话用sizeof() 的方法来计算元素个数就是错的。

2023-08-20 15:03:10 133

原创 C语言 - 编写函数计算字符串中小写字母个数并转化为大写字母

编写一个函数,统计字符串中小写字母的个数,并把字符串中的小写字母转化成大写字母。

2023-08-20 13:11:04 1173

原创 c语言 - 函数的基本用法及传参

以上代码格式为 函数先声明,再调用,然后实现 的顺序。

2023-08-20 12:44:18 271

原创 c语言 - main函数参数解释

选项指定生成的可执行文件的名称。运行程序时,可以在程序名称后面添加任意个数的参数。这个示例程序会将命令行参数的个数、程序名称以及每个参数的值都打印出来。你可以将上面的代码保存为一个名为。举一个在Linux下使用。函数带参数的示例程序。来编译源文件,并使用。

2023-08-19 22:23:28 652

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除