自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Dola的博客

用思想眺望星空,用行动充实当下。

  • 博客(181)
  • 收藏
  • 关注

原创 C语言:到底什么是链接,它起到了什么作用?

这样,不管在 func 之前增加或者减少了多少条指令导致 func 的地址发生了变化,汇编器在每次汇编程序的时候会重新计算 func 这个符号的地址,然后把所有使用到 func 的地方修正为新的地址,整个过程不需要人工参与。几十年以前,计算机刚刚诞生,人们编写程序时,将所有的代码都写在同一个源文件中,经过长期的积累,程序包含了数百万行的代码,以至于人们无法维护这个程序了。从本质上讲,C 语言中的函数就是一个代码块,当发生函数调用时,就会执行其他的代码块,这个过程就是通过跳转指令来完成的。

2025-02-17 09:11:52 254

原创 C语言:符号——链接的粘合剂

链接器所做的主要工作跟前面提到的“人工调整地址”本质上没有什么两样,只不过现代的高级语言拥有诸多的特性,使得编译器和链接器更为复杂,功能更为强大,但从原理上来讲,无非是找到符号的地址,或者把指令中使用到的地址加以修正。有了链接器,我们可以直接调用其他模块中的函数而无需知道它们的地址,因为在链接的时候,链接器会根据符号 func 自动去 module.c 模块查找 func 的地址,然后将 main.c 模块中所有使用到 func 的指令重新修正,让它们的目标地址成为真正的 func() 函数的地址。

2025-02-15 09:15:05 805

原创 C语言:强符号和弱符号

在 main.c 中,a 和 func 都是弱符号,在 module.c 中,a 和 func 都是强符号,强符号会覆盖弱符号,所以链接器最终会使用 module.c 中的符号,输出结果也印证了这一点。弱符号对于库来说十分有用,我们在开发库时,可以将某些符号定义为弱符号,这样就能够被用户定义的强符号覆盖,从而使得程序可以使用自定义版本的函数,增加了很大的灵活性。weak1 和 weak2 是弱符号,strong 和 main 是强符号,而 ext 既非强符号也非弱符号,它是一个对外部变量的引用(使用)

2025-02-15 09:14:50 327

原创 C语言:强引用和弱引用

弱引用和强引用非常利于程序的模块化开发,我们可以将程序的扩展模块定义为弱引用,当我们将扩展模块和程序链接在一起时,程序就可以正常使用;目前我们所看到的符号引用,在所有目标文件被链接成可执行文件时,它们的地址都要被找到,如果没有符号定义,链接器就会报符号未定义错误,这种被称为强引用(StrongReference)。链接器处理强引用和弱引用的过程几乎是一样的,只是对于未定义的弱引用,链接器不认为它是一个错误,一般默认其为 0(地址为 0),或者是一个特殊的值,以便程序代码能够识别。

2025-02-14 09:14:51 257

原创 C 语言模块化编程中的头文件

在项目开发中,我们可以将一组相关的变量和函数定义在一个 .c 文件中,并用一个同名的 .h 文件(头文件)进行声明,其他模块如果需要使用某个变量或函数,那么引入这个头文件就可以。这样做的另外一个好处是可以保护版权,我们在发布相关模块之前,可以将它们都编译成目标文件,或者打包成静态库,只要向用户提供头文件,用户就可以将这些模块链接到自己的程序中。.c 和.h 文件都是源文件,除了后缀不一样便于区分外和管理外,其他的都是相同的,在.c 中编写的代码同样也可以写在.h 中,包括函数定义、变量定义、预处理等。

2025-02-14 09:14:35 324

原创 细说 C 语言头文件的路径

需要注意的是,我们可以将./省略,此时默认从当前目录开始查找,例如#include "xyz.h"、#include"include/xyz.h"、#include "../xyz.h"、#include "../include/xyz.h"。以 Windows 为例,假设在 E:/cDemo/中有源文件 main.c 和头文件 xyz.h,那么在 main.c 中使用#include"./xyz.h"语句就可以引入 xyz.h,其中./表示当前目录,也即 E:/cDemo/

2025-02-13 09:15:49 661

原创 防止 C 语言头文件被重复包含

现在我们不妨换一种场景,假设 xyz1.h 中定义了类型 RYPE1,xyz2.h 中定义了类型 TYPE2,并且它们都包含了 stdio.h,如果主模块需要同时使用 TYPE1 和 TYPE2,就必须将 xyz1.h 和 xyz2.h 都包含进来,这样也会导致 stdio.h 被重复包含,并且无法回避,上面的方案解决不了问题。头文件包含命令 #include 的效果与直接复制粘贴头文件内容的效果是一样的,预处理器实际上也是这样做的,它会读取头文件的内容,然后输出到 #include 命令所在的位置。

2025-02-13 09:15:20 356

原创 C 语言 static 变量和函数

我们知道,全局变量和函数的作用域默认是整个程序,也就是所有的源文件,这给程序的模块化开发带来了很大方便,让我们能够在模块 A 中调用模块 B 中定义的变量和函数,而不用把所有的代码都集中到一个模块。静态局部变量虽然存储在全局数据区,但是它的作用域仅限于函数内部,func() 中的 n 在函数外无效,与main() 中的 n 不冲突,除了变量名一样,没有任何关系。下面我们通过一个实例来演示。注意:全局数据区的变量只能被初始化(定义)一次,以后只能改变它的值,不能再被初始化,即使有这样的语句,也无效。

2025-02-12 09:12:38 902

原创 C语言:目标文件和可执行文件里面都有什么?

常见的数据权限无外乎三种:只读(例如 .rodata 只读数据段)、读写(例如 .data 数据段)、读取和执行(例如 .text 代码段),我们将一块连续的、具有相同权限的数据称为一个 Segment,一个 Segment 由多个权限相同的 Section 构成。从广义上讲,目标文件与可执行文件的存储格式几乎是一样的,我们可以将它们看成是同一种类型的文件,在Windows 下,将它们统称为 PE 文件,在 Linux 下,将它们统称为 ELF 文件。链接的一个重要作用就是找到这些变量和函数的地址。

2025-02-12 09:12:16 1109

原创 那些被编译器隐藏了的过程

预处理和汇编的过程都比较简单,有了上面的介绍,相信大家很容易理解。而目标文件的结构、可执行文件的结构、链接的过程是我们要重点研究的,它能够让我们明白多文件编程以及模块化开发的原理,这是大型项目开发的基石。对于平常应用程序的开发,很少有人会关注编译和链接的过程,因为我们使用的工具一般都是流行的集成开发环境(IDE),比如 Visual Studio、Dev C++、C-Free 等。编译是整个程序构建的核心部分,也是最复杂的部分之一,涉及到的算法较多,我们并不打算深入讨论,有兴趣的读者请查看《编译原理》

2025-02-11 09:13:33 541

原创 从 extern 关键字开始谈 C 语言多文件编程

其实不然,头文件中包含的都是函数声明,而不是函数定义,函数定义都在系统库中,只有头文件没有系统库在链接时就会报错,程序根本不能运行。在前面的教程中,我们都是将所有的代码写到一个源文件里面,对于小程序,代码不过几百行,这或许无可厚非,但当程序膨胀代码到几千行甚至上万行后,就应该考虑将代码分散到多个文件中,否则代码的阅读和维护将成为一件痛苦的事情。extern 是“外部”的意思,很多教材讲到,extern 用来声明一个外部(其他文件中)的变量或函数,也就是说,变量或函数的定义在其他文件中。

2025-02-11 09:10:59 591

原创 malloc 函数背后的实现原理——内存池

相对于栈而言,堆这片内存面临着一个稍微复杂的行为模式:在任意时刻,程序可能发出请求,要么申请一段内存,要么释放一段已经申请过的内存,而且申请的大小从几个字节到几个 GB 都有可能,我们不能假设程序一次申请多少堆空间,因此,堆的管理显得较为复杂。内存池的研究重点不是向操作系统申请内存,而是对已申请到的内存的管理,这涉及到非常复杂的算法,是一个永远也研究不完的课题,除了 C 标准库自带的 malloc(),还有一些第三方的实现,比如 Goolge 的 tcmalloc和 jemalloc。

2025-02-10 09:17:10 802

原创 C 语言内存泄露(内存丢失)

这就导致了一个问题,第一次分配的 100 字节的内存没有指针指向它了,而且我们也不知道这块内存的地址,所以就再也无法找回了,也没法释放了,这块内存就成了垃圾内存,虽然毫无用处,但依然占用资源,唯一的办法就是等程序运行结束后由操作系统回收。free() 函数的用处在于实时地回收内存,如果程序很简单,程序结束之前也不会使用过多的内存,不会降低系统的性能,那么也可以不用写 free() 函数。这样的操作没有意义,因为没有指针指向分配的内存,无法使用,而且无法通过 free() 释放掉,造成了内存泄露。

2025-02-10 09:16:41 336

原创 C 语言变量的存储类别和生存期

静态局部变量虽然存储在静态数据区,但是它的作用域仅限于定义它的代码块,sum() 中的 result 在函数外无效,与 main() 中的 result 不冲突,除了变量名一样,没有任何关系。通俗地讲,生存期指的是在程序运行过程中,变量从创建到销毁的一段时间,生存期的长短取决于变量的存储类别,也就是它所在的内存区域。注意:静态数据区的变量只能初始化(定义)一次,以后只能改变它的值,不能再被初始化,即使有这样的语句,也无效。我们知道,变量是有数据类型的,用以说明它占用多大的内存空间,可以进行什么样的操作。

2025-02-09 09:59:31 469

原创 C 语言野指针以及非法内存操作

这是因为,freed() 只是释放掉了动态分配的内存,但并未改变 str 的值,str 的值不是 NULL,它仍然指向被释放掉的内存,所以会执行 if 语句里面的 puts() 函数。arr 数组在栈上分配内存,字符串"hello world"就存储在这里,func() 函数运行结束后,这块内存被释放掉,但是函数外部的 pstr 仍然指向这里,所以执行 puts(pstr);当然,如果足够幸运的话,str 也可能恰好指向一段分配好的、并且有读写权限的内存,程序就运行成功了,但这是小概率事件,一般不会发生。

2025-02-09 09:59:10 603

原创 一篇文章带你轻松解决Windows系统右键新建Word、Excel、PPT功能缺失的问题

在注册表左侧第一项HKEY_CLASSES_ROOT中,选择我们需要开启新建的文件类型,如Excel文件选择.xlsx,Word文件选择.docx,PPT文件选择.pptx。我这里演示Excel的右键缺失修复,选择.xlsx,在默认处我们已经可以分析到问题原因,是因为我安装了腾讯文档软件,导致我的.xlsx文件默认应用都变成了腾讯文档导致的。此时双击默认,修改数值为对应数值即可,如下所示,修改完后刷新桌面,如未显示重启电脑即可。

2025-02-08 11:05:08 444

原创 C语言动态内存分配

程序启动时会为栈区分配一块大小适当的内存,对于一般的函数调用这已经足够了,函数进栈出栈只是 ebp、esp 寄存器指向的变换,或者是向已有的内存中写入数据,不涉及内存的分配和释放。这称为静态内存分配。注意:calloc() 函数是对 malloc() 函数的简单封装,参数不同,使用时务必小心,第一参数是第二参数的单元个数,第二参数是单位的字节数。注意:分配内存在动态存储区(堆区),手动分配,手动释放,申请时空间可能有也可能没有,需要自行判断,由于返回的是 void*,建议手动强制类型转换。

2025-02-08 10:33:18 821

原创 栈溢出攻击的原理是什么?

局部数组也是在栈上分配内存,当输入"12345678901234567890" 时,会发生数组溢出,占用“4 字节空白内存”、“old ebp”和“返回地址”所在的内存,并将原有的数据覆盖掉,这样当 main() 函数执行完成后,会取得一个错误的返回地址,该地址上的指令是不确定的,或者根本就没有指令,所以程序在返回时出错。C 语言不会对数组溢出做检测,这是一个典型的由于数组溢出导致覆盖了函数返回地址的例子,我们将这样的错误称为“栈溢出错误”。

2025-02-07 16:45:46 428

原创 C语言:用一个实例来深入剖析函数进栈出栈的过程

首先将原来 ebp 寄存器的值压入栈中(也即图中的 oldebp),并将 esp 的值赋给 ebp,这样 ebp 就从 main() 函数的栈底指向了 func() 函数的栈底,完成了函数栈的切换。经过上面的分析可以发现,函数出栈只是在增加 esp 寄存器的值,使它指向上一个数据,并没有销毁之前的数据。为局部变量分配内存时,仅仅是将 esp 的值减去一个整数,预留出足够的空白内存,不同的编译器在不同的模式下会对这片空白内存进行不同的处理,可能会初始化为一个固定的值,也可能不进行初始化。

2025-02-07 16:44:19 909

原创 函数调用管理(Calling Convention)

对于 main() 调用 funcB(),我们称 main() 是调用方,funcB() 是被调用方;同理,对于 funcB() 调用 funcA(),funcB() 是调用方,funcA() 是被调用方。以 funcB() 为例,假设 main() 函数先将 19.9 入栈,后将 28.5 入栈,但是 funcB() 在使用这些实参时却认为28.5 先入栈,19.9 后入栈,那么就一定会产生混乱,误以为 19.9 是传递给 b、28.5 是传递给 a 的。

2025-01-23 10:19:33 392

原创 C语言:用户模式和内核模式

但是用户程序是非常不安全的,内核对用户程序也是充分不信任的,当程序调用内核接口时,内核要做各种校验,以防止出错。内核空间存放的是操作系统内核代码和数据,是被所有程序共享的,在程序中修改内核空间中的数据不仅会影响操作系统本身的稳定性,还会影响其他程序,这是非常危险的行为,所以操作系统禁止用户程序直接访问内核空间。要想访问内核空间,必须借助操作系统提供的 API 函数,执行内核提供的代码,让内核自己来访问,这样才能保证内核空间的数据不会被随意修改,才能保证操作系统本身和其他程序的稳定性。

2025-01-23 10:18:09 378

原创 C语言:分页机制如何实现

现在硬件很便宜了,内存容量大了,很多电脑都配备 4G 或 8G 的内存,页表数组占用 4M 内存或许不觉得多,但在 32 位系统刚刚发布的时候,内存还是很紧缺的资源,很多电脑才配备 100M 甚至几十兆的内存,4M 内存就显得有点大了,所以还得对上面的方案进行改进,压缩页表数组所占用的内存。在极少数的情况下,程序占用的内存非常大,布满了 4G 的虚拟地址空间,这样小页表的数量可能接近甚至等于1024,再加上页目录占用的存储空间,总共是 4MB+4KB,比上面使用一级页表的方案仅仅多出 4KB 的内存。

2025-01-21 09:26:16 815

原创 C语言:内存分页机制,完成虚拟地址映射

Program 1 的 VP2、VP3 不在内存中,但是当进程需要用到这两个页的时候,硬件会捕获到这个消息,就是所谓的页错误(Page Fault),然后操作系统接管进程,负责将 VP2 和 PV3 从磁盘中读取出来并且装入内存,然后将内存中的这两个页与 VP2、VP3 之间建立映射关系。物理内存也是同样的分法。这里,我们把虚拟空间的页叫做虚拟页(VP,Virtual Page),把物理内存中的页叫做物理页(PP,PhysicalPage),把磁盘中的页叫做磁盘页(DP,Disk Page)。

2025-01-21 09:23:28 751

原创 C语言:虚拟地址空间及编译模式

所谓虚拟地址空间,就是程序可以使用的虚拟地址的有效范围。虚拟地址和物理地址的映射关系由操作系统决定,相应地,虚拟地址空间的大小也由操作系统决定,但还会受到编译模式的影响。这节我们先讲解 CPU,再讲解编译模式,让大家了解编译器是如何配合 CPU 来提高程序运行速度的。CPU 是计算机的核心,决定了计算机的数据处理能力和寻址能力,也即决定了计算机的性能。

2025-01-13 16:58:35 1030

原创 C语言:一篇内容带你了解虚拟内存

代码中的 a、b 是全局变量,它们的内存地址在链接时就已经决定了,以后再也不能改变,该程序无论在何时运行,结果都是一样的。那么问题来了,如果物理内存中的这两个地址被其他程序占用了怎么办,我们的程序岂不是无法运行了?幸运的是,这些内存地址都是假的,不是真实的物理内存地址,而是虚拟地址。虚拟地址通过 CPU 的转换才能对应到物理地址,而且每次程序运行时,操作系统都会重新安排虚拟地址和物理地址的对应关系,哪一段物理内存空闲就使用哪一段。

2025-01-13 16:56:55 795

原创 C语言:内存中程序是如何运行的

程序是保存在硬盘中的,要载入内存才能运行,CPU 也被设计为只能从内存中读取数据和指令。对于 CPU 来说,内存仅仅是一个存放指令和数据的地方,并不能在内存中完成计算功能,例如要计算 a = b +c,必须将 a、b、c 都读取到 CPU 内部才能进行加法运算。为了了解具体的运算过程,我们不妨先来看一下CPU 的结构。CPU 是一个复杂的计算机部件,它内部又包含很多小零件,如下图所示:运算单元是 CPU 的大脑,负责加减乘除、比较、位移等运算工作,每种运算都有对应的电路支持,速度很快。

2025-01-08 09:09:32 1502

原创 C语言:调试的总结和技巧

接下来,我们来了解一下调试标记。此时,我们就应该考虑问题是否出现在之前的函数上了,可能因为偶然性,我们第一次测试函数的时候并没有发现其错误,导致范围锁定产生偏差,此时我们需要再次耐心的对所有未排除嫌疑的进行调试,直至再次找到出错的函数。当我们运行我们编写的程序发现运行结果与我们预想的不同的时候,我们可以先用即时窗口,使用一些比较简单的数据来测试我们的各个函数运行结果是否符合我们的预期,如果都符合的话,我们可以使用程序中产生的一些比较复杂的数据来进一步测试我们的各个函数,直至找到可能导致错误的函数。

2025-01-08 09:07:25 913

原创 C语言:assert断言函数

很明显,这样做是不可以的。我们看到,只要我们定义了 NDEBUG 宏,assert 就会失效,而 Visual Studio 的默认的发布版程序编译参数中定义了 NDEBUG 宏,所以我们不用额外定义,但是在其他编译器中,我们在发布程序的时候就必须在包含assert.h 头文件前定义 NDEBUG 宏,避免 assert 生效,否则总是让用户看到“程序已经停止运行,正在寻找解决方案 . . .”的 Windows 系统对话框可就不妙了。在我们的实际使用过程中,我们需要注意一些使用 assert 的问题。

2025-01-06 09:22:42 698

原创 C语言:单步调试与即时窗口的使用

在实际开发中,常常会出现这样的情况,我们可以大致把出现问题的代码锁定在一定范围内,但无法确定到底是哪条语句出现了问题,该怎么办呢?按照前面的思路,必须要在所有代码行前面设置断点,让代码一个断点一个断点地执行。这种方案确实可行,但很麻烦,也不专业,这节我们就来介绍一种更加便捷的调试技巧——单步调试。所谓单步调试,就是让代码一步一步地执行。

2025-01-06 09:18:50 822

原创 C语言:调试的概念和调试器的选择

在调试的过程中,我们可以监控程序的每一个细节,包括变量的值、函数的调用过程、内存中数据、线程的调度等,从而发现隐藏的错误或者低效的代码。我敢保证,每个人都会遇到逻辑错误,而且会经常遇到,初学者更是错的离谱,所以,必须掌握调试技能,没有选择的余地,没有学会调试就是没有学会编程!严格来说,调试器遇到断点时会把程序暂时挂起,让程序进入一种特殊的状态——中断状态,这种状态下操作系统不会终止程序的执行,也不会清除与程序相关的元素,比如变量、函数等,它们在内存中的位置不会发生变化。双击变量的值,可以进行修改。

2024-12-31 17:10:58 1061

原创 C语言:获取文件大小(长度)、插入、删除、更改文件内容

实际开发中,有时候需要先获取文件大小再进行下一步操作。C 语言没有提供获取文件大小的函数,要想实现该功能,必须自己编写函数。注意:fp 要以二进制方式打开,如果以文本方式打开,函数的返回值可能没有意义。先使用 fseek() 将文件内部指针定位到文件末尾,再使用 ftell() 返回内部指针距离文件开头的字节数,这个返回值就等于文件的大小。这段代码并不健壮,它移动了文件内部指针,可能会导致接下来的文件操作错误。fread() 函数将永远读取不到内容。

2024-12-25 11:16:48 1105

原创 FILE 结构体以及缓冲区深入探讨

如果我们通过 setbuf()或 setvbuf()函数将缓冲区设置 10 个字节的大小,而我们从键盘输入了 20 个字节大小的数据,这样我们输入的前 10 个数据会放在缓冲区中,因为我们设置的缓冲区的大小只能够装下 10 个字节大小的数据,装不下 20 个字节大小的数据。上面的箭头表示的区域就相当是一个输入流,红色的地方相当于一个开关,这个开关可以控制往深绿色区域(标注的是缓冲区)里放进去的数据,输入 20 个字节的数据只往缓冲区中放进去了 10 个字节,剩下的 10 个字节的数据就被停留在了输入流里!

2024-12-24 10:40:45 880

原创 C语言:随机读写文件、实现文件复制功能

前面介绍的文件读写函数都是顺序读写,即读写文件只能从头开始,依次读写各个数据。但在实际开发中经常需要读写文件的中间部分,要解决这个问题,就得先移动文件内部的位置指针,再进行读写。这种读写方式称为随机读写,也就是说从文件的任意位置开始读写。实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。文件定位函数 rewind 和 fseek移动文件内部位置指针的函数主要有两个,即 rewind() 和 fseek()。参数说明:fp 为文件指针,也就是被移动的文件。

2024-12-24 10:38:44 709

原创 C语言:以数据块的形式读写文件

fgets() 有局限性,每次最多只能从文件中读取一行内容,因为 fgets() 遇到换行符就结束读取。如果希望读取多行内容,需要使用 fread() 函数;相应地写入函数为 fwrite()。fread() 函数用来从指定文件中读取块数据。所谓块数据,也就是若干个字节的数据,可以是一个字符,可以是一个字符串,可以是多行数据,并没有什么限制。fread() 的原型为:对参数的说明: ptr 为内存区块的指针,它可以是数组、变量、结构体等。

2024-12-20 14:14:33 534

原创 C语言:以字符形式读写文件

在 C 语言中,读写文件比较灵活,既可以每次读写一个字符,也可以读写一个字符串,甚至是任意字节的数据(数据块)。本节介绍以字符形式读写文件。以字符形式读写文件时,每次可以从文件中读取一个字符,或者向文件中写入一个字符。主要使用两个函数,分别是fgetc() 和 fputc()。

2024-12-18 11:53:29 1155

原创 C语言中文件是什么?文件文本和二进制文件的区别

我们对文件的概念已经非常熟悉了,比如常见的 Word 文档、txt 文件、源文件等。文件是数据源的一种,最主要的作用是保存数据。在操作系统中,为了统一对各种硬件的操作,简化接口,不同的硬件设备也都被看成一个文件。对这些文件的操作,等同于对磁盘上普通文件的操作。例如:通常把显示器称为标准输出文件,printf 就是向这个文件输出数据;通常把键盘称为标准输入文件,scanf 就是从这个文件读取数据。我们不去探讨硬件设备是如何被映射成文件的,大家只需要记住,在 C 语言中硬件设备可以看成文件,有些输入输出函数不需

2024-12-18 11:53:15 846

原创 C语言打开文件:fopen函数的用法

在 C 语言中,操作文件之前必须先打开文件;所谓“打开文件”,就是让程序和文件建立连接的过程。打开文件之后,程序可以得到文件的相关信息,例如大小、类型、权限、创建者、更新时间等。在后续读写文件的过程中,程序还可以记录当前读写到了哪个位置,下次可以在此基础上继续操作。标准输入文件 stdin(表示键盘)、标准输出文件 stdout(表示显示器)、标准错误文件 stderr(表示显示器)是由系统打开的,可直接使用。filename 为文件名(包括文件路径),mode 为打开方式,它们都是字符串。

2024-12-16 14:08:37 1127

原创 C语言:随机数生成rand()和srand()

在实际编程中,我们经常需要生成随机数,例如,贪吃蛇游戏中在随机的位置出现食物,扑克牌游戏中随机发牌。void 表示不需要传递参数。C 语言中还有一个 random() 函数可以获取随机数,但是 random() 不是标准函数,不能在 VC/VS 等编译器通过,所以比较少用。RAND_MAX 是 头文件中的一个宏,它用来指明 rand() 所能返回的随机数的最大值。C 语言标准并没有规定 RAND_MAX 的具体数值,只是规定它的值至少为 32767。

2024-12-16 14:03:18 880

原创 C语言:const的用法

有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定。例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小。我们经常将 const 变量称为常量(Constant)。但我们通常采用第一种方式,不采用第二种方式。另外建议将常量名的首字母大写,以提醒程序员这是个常量。由于常量一旦被创建后其值就不能再改变,所以常量必须在定义的同时赋值(初始化),后面的任何赋值行为都将引发错误。运行结果: 100, 90, 80。

2024-12-14 16:48:00 1025

原创 C语言:结构体共用体

共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。结构体占用的内存大于等于所有成员占用内存的总和(成员之间可能会有缝隙)共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。

2024-12-13 11:13:16 430

AI大模型-DeepSeek V3搭建个人知识库教程

本教程详细介绍了如何使用 DeepSeek V3 搭建个人知识库,内容包括: 前置准备:注册 DeepSeek 账号并获取 API 密钥。 接入 DeepSeek:登录官网、创建密钥、选择模型。 下载并安装 anythingLLM:获取并安装 anythingLLM 应用程序。 配置 anythingLLM:选择 DeepSeek 作为 AI 提供商,输入密钥。 创建工作区:建立个人工作区,导入文档。 开始聊天:完成所有准备工作后,开始与知识库进行交互。 适用人群 个人用户:希望高效管理个人知识、学习资料或工作文档。 研究人员:整理学术文献、研究笔记,快速查找信息。 企业用户:搭建企业内部知识库,提升团队协作效率。 学生:整理课程资料、笔记,辅助学习和复习。 开发者:了解如何将 DeepSeek 集成到自己的项目中。 使用场景及目标 个人知识管理:将碎片化的知识和文档整合到一个系统中,方便快速查找和回顾。 学术研究:整理和分析大量的文献资料,提高研究效率。 企业知识共享:搭建企业内部知识库,便于团队成员共享和协作。 学习辅助:整理学习资料,辅助学习和复习,提升学习效率。

2025-02-11

AI大模型-DeepSeek教程从入门到精通

内容概要 《DeepSeek教程-从入门到精通》是一本全面、系统的DeepSeek使用手册,覆盖从基础操作到高级应用的全过程。全书分为六章,内容包括: 第一章:准备篇:快速上手DeepSeek,创建AI伙伴,掌握基本操作。 第二章:基础对话篇:学习有效提问技巧,掌握基础指令,提升沟通效率。 第三章:效率飞跃篇:文档分析、代码生成、复杂任务处理,提升工作效率。 第四章:场景实战篇:涵盖学术论文、自媒体运营、智能学习规划等实战场景。 第五章:高手进化篇:构建私人知识库、自动化工作流搭建、跨语言切换实战。 第六章:自我提升篇:提升学习能力、自我校正、零基础代码入门等。 适用人群 初学者:零基础用户,快速上手DeepSeek,掌握基本操作。 进阶用户:有一定基础,希望提升效率和解决复杂问题的用户。 专业人士:学术研究人员、自媒体运营者、程序员、系统开发者等。 企业用户:用于团队培训、项目管理、自动化工作流搭建等。 使用场景及目标 学术研究:辅助开题、文献整理、论文写作、格式调整、查重降重。 自媒体运营:内容创作、标题生成、数据分析、排版优化。 智能学习规划:定制学习方案、知识点攻克、学习监督。

2025-02-11

ipmsg飞鸽传输项目源码与软件需求说明书.zip

资源描述: 【Linux系统开发实战】飞鸽传输项目,全面掌握Linux网络编程! 飞鸽传输实训项目源码,Linux系统开发的经典案例,助你深入理解网络通信机制。 完整的项目源代码,包含客户端和服务端实现,适合作为教学或自学材料。 通过实际项目操作,学习socket编程、多线程处理、进程间通信等关键技术。 适合计算机科学、软件工程等专业学生,以及Linux系统开发工程师。 项目源码经过严格测试,代码规范,注释清晰,易于学习和修改。 资源亮点: 完整项目:提供从零开始的飞鸽传输项目全套源码。 实战教程:通过具体的网络通信项目,提升你的Linux系统开发能力。 技术全面:涉及Linux网络编程的多个核心技术点,如TCP/IP、UDP等。 代码质量:源码结构清晰,代码风格规范,充分展示良好的编程习惯。 学习路径:适合初学者逐步深入,也适合有经验的开发者作为参考。 立即下载,开启你的Linux系统开发学习之旅,掌握网络编程核心技术。

2024-09-06

《Linux操作系统命令全攻略》图解手册

资源描述: 【Linux命令终极指南】一网打尽所有常用Linux命令! 精心整理的Linux命令图解手册,覆盖文件管理、系统监控、网络操作等核心命令。 从基础到高级,无论是新手还是老手,都能快速提升你的Linux操作技能。 通过直观的命令图解,帮助你轻松记忆和理解每个命令的用法。 详细解释命令参数,让你能够灵活运用于各种场景。 包括但不限于 chown, chmod, mv, cp, rm, less, more, locate, touch 等实用命令。 适合Linux系统管理员、开发者和学生,是学习Linux命令的必备资料。 资源亮点: 全面覆盖:包含150+ 常用Linux命令及其用法。 图解手册:直观的命令图解,易于理解和记忆。 实战应用:每个命令都配有实际使用场景,学以致用。 参数详解:深入讲解命令参数,让你的命令操作更加精准。 适合各类用户:无论你是Linux新手还是有一定基础的用户,都能从中获益。

2024-09-06

《C++ STL标准模板库完全指南》详解与实战案例

资源描述: 【C++ STL 终极指南】深入掌握标准模板库的每个角落! 从基础到高级,全面解析 STL 容器、迭代器、算法及函数对象。 详细讲解 STL 的 13 个头文件,包括 vector, list, map, set 等常用容器。 通过实际编程案例,教你如何高效使用 STL 解决实际问题。 深入理解 STL 设计理念,提升 C++ 编程技巧和代码效率。 适合 C++ 初学者和进阶开发者,是每个 C++ 程序员的案头必备资源。 资源亮点: 全面深入:覆盖 STL 的所有核心概念和高级特性。 实战案例:通过学校演讲比赛等实际案例,展示 STL 的应用。 代码解析:提供大量可运行的代码示例,快速提升实战能力。 性能优化:探讨 STL 容器的选择和使用,优化你的程序性能。 易于理解:用浅显易懂的语言和示例,让复杂概念变得简单。 立即下载,让你的 C++ STL 技能突飞猛进,成为编程高手!

2024-09-06

《150款专业单页简历模板》精选合集

资源描述: 【求职必备】150款单页简历模板,让你的简历脱颖而出! 设计师精选模板,涵盖创意、专业、经典等多种风格,满足不同行业需求。 适用于应届毕业生、职场跳槽者,以及寻求职业发展的专业人士。 每款模板均精心布局,突出关键信息,让HR一眼看到你的优势。 包含可编辑文本框,轻松自定义内容,快速打造个性化简历。 简历是求职的敲门砖,用专业模板提升你的面试机会! 模板特色: 多样化风格:从简约到创意设计,总有一款适合你。 专业设计:每份简历模板都由专业设计师精心打造。 易于编辑:所有文本均可轻松编辑,无需专业设计软件。 面试利器:用这些简历模板,提高你的求职成功率。 行业通用:适合IT、金融、教育、设计等各行各业。 立即下载,为你的职业生涯增添亮点,开启成功之路!

2024-09-06

《嵌入式面试Linux核心知识点》全面解析

资源描述: 【嵌入式Linux面试宝典】掌握Linux系统知识,面试无忧! 精心整理的嵌入式Linux面试题库,覆盖文件系统、进程管理、网络配置等关键领域。 包含Linux系统管理、设备驱动、网络协议等核心知识点,助力技术深度提升。 针对Linux系统的深入解析,从基础到高级,适合嵌入式开发人员及Linux系统工程师。 面试题结合实际应用,帮助理解Linux系统工作原理,提高问题解决能力。 备战技术面试,从这份资料开始,让你在面试中脱颖而出! 资料亮点: 全面覆盖:Linux系统核心知识点一网打尽,系统性学习更高效。 实战导向:结合实际工作场景,提升面试和工作应用能力。 易于理解:深入浅出的解析,让复杂知识点变得简单易懂。 面试必备:精选面试题目,助力求职者快速掌握Linux系统要点。 立即下载,为即将到来的面试做足准备,拿下心仪岗位!

2024-09-06

F103-指南者-原理图.zip

文件类型:PDF 文件名称:F103-指南者-原理图.pdf 内容概要:该文件为一个原理图文件,详细描述了STM32F103VET6微控制器板的电路设计和元件布局。包括电源电路、USB-5V供电、SD卡接口、串行FLASH、EEPROM、USB-Device LED、按键、电容按键、程序上使用的ADC捕获功能、I2C、SPI、SDIO、摄像头接口、ADC接口、液晶接口等。 适用人群:电子工程师、硬件开发者、嵌入式系统设计师等。 使用场景及目标:用于设计和开发基于STM32F103VET6的电子产品,进行电路设计验证、元件布局规划、硬件调试等。 其他说明:文件中包含了详细的元件标注、引脚定义、接口说明,适合进行深入的硬件设计分析和学习。

2024-08-31

STM32固件库使用手册的中文翻译版.zip

本文档提供了详细的STM32固件库使用手册的中文翻译版,涵盖了32位基于ARM微控制器STM32F101xx与STM32F103xx的固件函数库。手册内容包括外设驱动的描述、应用实例、固件库文件描述、外设初始化和设置、位段映射、运行时间检测等关键信息。此外,还详细介绍了各个外设的寄存器结构和库函数,如ADC、BKP、CAN、DMA、EXTI、FLASH、GPIO、I2C、IWDG、NVIC、PWR、RCC、RTC、SPI等,为开发者在使用STM32微控制器进行嵌入式系统开发时提供了宝贵的参考。

2024-08-31

VM ware虚拟机许可密钥

VM ware虚拟机许可密钥,适用于16、17版本虚拟机

2024-08-29

掌握UDP网络编程:嵌入式系统工程师的高效通信指南

档首先概述了UDP(用户数据报协议)的核心特性——无连接的传输方式,以及它与TCP(传输控制协议)的主要差异。UDP的简洁性使其在DNS查询、流媒体传输等场景中得到广泛应用,尤其适合那些对实时性要求高、可以容忍一定数据丢失的应用。 在基本UDP编程部分,文档详细介绍了UDP Socket编程的关键步骤,包括使用recvfrom和sendto函数进行数据的接收和发送。这些函数的参数和返回值被清晰解释,指导读者如何构建一个基本的UDP客户端和服务器,并通过示例代码演示了UDP Echo Server和Client的实现。 文档进一步探讨了UDP广播的概念和应用,解释了广播在局域网内如何工作,以及它在减少网络流量和提高通信效率方面的优势。详细介绍了广播地址的类型,包括子网定向广播和受限广播,以及它们在网络协议中的应用。 此外,文档还介绍了套接口选项setsockopt的使用,如何设置发送和接收缓冲区大小,以及如何启用广播选项,为读者提供了网络编程中性能优化的重要手段。 最后,通过具体的广播示例,文档展示了如何在实际编程中应用UDP广播技术,进一步丰富了读者的网络编程视野。

2024-08-24

精通Socket编程:嵌入式系统工程师的TCP/IP网络通信指南

在网络编程的世界里,Socket是连接不同计算机系统的灵魂。这篇《Socket编程》文档,将引领嵌入式系统工程师深入探索Socket编程的奥秘,从基础概念到实际应用,为读者提供了一条清晰的学习路径。 文档首先回顾了Socket的历史背景,讲述了它如何在UNIX系统中诞生,并随着TCP/IP协议的普及而成为网络通信的标准接口。Socket不仅解决了不同主机进程间的通信问题,还巧妙地处理了网络间进程标识和多重协议识别的挑战。 进一步,文档详细介绍了Socket编程的基础概念,包括字节序的重要性和转换技巧,让读者理解网络协议中通讯字节序的规范,并掌握如何在不同计算机系统间进行数据交换。通过具体的函数示例,文档展示了如何进行主机字节序与网络字节序之间的转换。 在深入探讨了Socket地址结构后,文档逐步引导读者学习如何创建套接字、绑定地址、监听连接请求、接受连接、以及如何进行数据传输。每个步骤都配有清晰的代码示例和解释,使得复杂的网络编程变得易于理解和操作。 文档不仅覆盖了TCP服务器和客户端的建立过程,还详细描述了数据传输的方法和关闭连接的正确步骤。

2024-08-24

嵌入式系统工程师必读:全面深入的计算机网络基础与TCP/IP协议解析

在当今数字化时代,对计算机网络的深刻理解是每位嵌入式系统工程师的必备技能。这篇《计算机网络概述》文档,以其全面而精炼的内容,为读者提供了一个深入学习网络基础的绝佳机会。 文档从计算机网络的发展简史开始,带我们穿越回电路交换网的早期时代,逐步过渡到分组交换的高效模式,直至今日的因特网盛世。它不仅讲述了ARPANET的历史性转变和TCP/IP协议的崛起,还深入探讨了TCP/IP协议的分层结构和各层的功能,包括应用层、传输层、网络层和数据链路层。 进一步,文档详细介绍了TCP和UDP两种协议的特点和适用场景,让读者能够根据应用需求选择合适的传输层协议。物理地址和IP地址的区分,以及子网掩码和端口的重要性,都在文档中得到了清晰的阐释,帮助读者构建起网络通信的完整图景。 此外,文档还涵盖了网络通信过程中数据报文在各层之间的传输情况,以及集线器、交换机和路由器等网络设备的功能和特点。特别是对静态路由表和动态路由表的讨论,进一步拓宽了读者对网络路由和数据传输背后逻辑的认识。

2024-08-24

嵌入式系统优化:线程管理与同步互斥机制解析

线程作为轻量级进程,存在于进程之中,共享资源,却拥有更少的系统开销,特别是在创建、切换和撤销操作时。这种特性使得线程成为提高程序效率和资源利用率的关键技术,尤其适用于多任务和并发程序设计,以及网络程序设计和多CPU系统中的并行处理。 通过pthread库的实用指南,文档介绍了线程生命周期的管理,包括如何创建、启动、同步、分离直至退出线程,以及如何使用线程属性和参数传递。每个函数调用都有清晰的参数说明和预期的返回值,让读者能够精准地控制线程行为。 进一步,文档深入探讨了线程同步与互斥的必要性,解释了互斥锁(mutex)和信号量(semaphore)的工作原理及其在多线程编程中的应用。互斥锁保证了同一时间只有一个线程可以访问共享资源,而信号量则通过计数机制控制对资源的访问,有效解决了生产者-消费者问题中的同步难题。 文档的最后部分提供了丰富的示例代码,如生产者消费者模型,帮助读者将理论知识应用于实际编程中。这些实例不仅巩固了读者对线程同步与互斥的理解,也激发了解决复杂问题的新思路。

2024-08-24

嵌入式系统开发:深入理解信号机制及其在进程通信中的应用

这篇文件是一份关于嵌入式系统中信号机制的详细介绍,它不仅涵盖了信号的基本概念和特性,还深入探讨了信号的基本操作和应用场景。信号是软件中断的一种模拟,它允许异步进程中断正在运行的进程,以处理突发事件。这种机制对于嵌入式系统尤为重要,因为它可以确保系统对外部事件做出快速响应。 文档首先解释了信号的异步通信特性,即进程无需等待信号的到来,也无法预知信号何时到达。接着,它详细介绍了信号的命名规则和如何在Linux系统中查看信号与数字编码的对应关系。例如,使用命令kill -l可以列出所有信号及其对应的数字编码。 进一步,文档列举了产生信号的几种情况,包括用户操作、硬件异常、软件异常、调用kill函数和运行kill命令。每种情况下,文档都提供了详细的解释和示例,帮助读者理解信号是如何在不同情境下产生的。 文档还介绍了进程收到信号后的几种处理方式:忽略信号、执行系统默认动作或自定义信号处理函数。特别强调了SIGKILL和SIGSTOP信号不能被忽略,因为它们提供了一种可靠的进程终止方法。

2024-08-24

掌握嵌入式系统中的高效IPC:消息队列与共享内存深度解析

消息队列和共享内存作为Linux系统中的IPC机制,为进程间的数据交换和资源共享提供了高效的方法。消息队列是内核维护的、存放在内存中的消息链表,支持按类型随机查询消息,不局限于先进先出的次序。而共享内存则允许多个进程共享同一块内存区域,实现数据的快速访问。 本文首先介绍了消息队列的基本概念和特点,包括其在内存中的持久性、系统范围内的唯一标识符,以及Linux系统中对消息队列的限制。通过ftok函数和msgget函数,读者可以学习如何创建和获取消息队列。文中还提供了使用msgsnd和msgrcv函数进行消息发送和接收的示例,以及如何通过msgctl函数对消息队列进行控制。 共享内存部分则从互斥访问的必要性讲起,介绍了共享内存的基本概念和Linux系统对其的限制。通过shmget函数,读者可以了解如何创建或打开共享内存段。文中还详细阐述了如何使用shmat函数将共享内存映射到进程数据段,以及如何使用shmdt和shmctl函数进行共享内存的控制和操作。

2024-08-24

嵌入式系统中的进程间通信:深入管道与命名管道

摘要: 进程间通信是嵌入式系统设计中的一个关键环节。本文详细介绍了两种基础IPC机制:管道和命名管道(FIFO),以及它们在Linux系统中的实现和应用。 正文: 在多任务操作系统中,进程间通信(IPC)是实现数据交换和资源共享的基石。本文从IPC的基本概念出发,阐述了数据传输、资源共享、事件通知和进程控制的重要性。进一步,文章深入探讨了Linux系统中的IPC机制,包括UNIX传统IPC、SYSTEM V IPC、POSIX IPC以及基于Socket的IPC。 特别地,本文重点介绍了两种IPC机制:管道和命名管道(FIFO)。管道是一种半双工通信方式,仅存在于内存中,适用于具有公共祖先的进程间通信。而命名管道(FIFO)则作为一种特殊的文件存在于文件系统中,允许不同进程通过命名进行通信,具有更广泛的应用场景。 文章详细解释了管道的创建和使用,包括pipe()系统调用的参数和返回值,以及父子进程如何通过管道实现数据传输。同时,也探讨了文件描述符的概念及其在IPC中的作用,介绍了dup()和dup2()系统调用的使用,以及它们在重定向标准输入输出中的应用。 对于命名管道,本文解

2024-08-24

深入解析嵌入式系统中的进程管理

摘要: 掌握进程管理是嵌入式系统工程师的核心技能之一。本文深入探讨了进程的基本概念、生命周期状态、进程控制块(PCB)的结构与作用,以及Linux环境下进程控制的高级技巧。 正文: 在嵌入式系统开发中,进程管理是确保系统稳定运行的关键。本资源详细介绍了进程的定义,区分了程序与进程的不同:程序是静态的指令集合,而进程则是动态的执行实例。进一步,文章阐述了进程的三种基本状态——就绪态、执行态和等待态,以及它们之间的转换关系。 特别值得一提的是进程控制块(PCB),它作为操作系统中最重要的数据结构,记录了进程的所有必要信息,是进程存在的唯一标识。文中还介绍了Linux系统中进程号(PID)、父进程号(PPID)和进程组号(PGID)的概念及其作用。 对于进程控制,文中不仅解释了如何使用fork()函数创建新进程,还探讨了父子进程间的同步问题,以及如何处理僵尸进程和孤儿进程等高级主题。此外,还提供了关于进程挂起、等待和退出的系统调用函数的详细说明,包括wait()、waitpid()、exit()和_exit()等。

2024-08-24

掌握系统调用与标准I/O:Linux系统编程精要

深入Linux系统编程的核心,探索系统调用的奥秘和标准I/O库的强大功能。《系统调用与标准I/O库》资源为您揭开了系统编程的复杂面纱,从内核到库的每个层面,提供了全面的指导和深入的解析。 系统调用概述:了解系统调用作为用户程序与操作系统内核交互的桥梁,掌握如何在应用程序中有效使用系统调用进行进程控制、文件操作等。 系统调用I/O函数:深入学习open、close、read、write等基本I/O函数,理解文件描述符的概念及其在系统调用中的关键作用。 系统调用与内核:探索系统调用的内部机制,包括软件中断、系统调用号的使用,以及如何在用户空间和内核空间之间进行切换。 标准I/O库函数:发现标准I/O库如何简化文件操作,提高编程效率。学习如何使用fopen、fclose、fread、fwrite等函数进行高级文件I/O操作。 实践亮点: 系统调用的分类和使用场景。 文件权限设置和模式标志的详细解析。 标准I/O与系统调用I/O的性能比较。

2024-08-24

Linux编程自动化:精通Make工具与Makefile

作为嵌入式系统工程师或Linux开发者,您是否厌倦了手动编译和维护代码的繁琐过程?《Linux下编程工具(make)》资源为您揭示了自动化代码构建的秘密——Make工具和Makefile的高级应用。 Make概述:GNU make不仅仅是一个构建工具,它是一种代码维护的艺术。它能够根据Makefile中定义的规则自动执行编译任务,极大提升开发效率。 Makefile语法:从基本的语法规则到复杂的依赖关系,Makefile让编译流程变得清晰和可控。掌握目标、依赖文件列表和命令列表的编写,让您的项目结构化、模块化。 Make命令:学会使用make命令的各种选项,如-f指定Makefile、-n执行命令前先打印、-s静默模式等,让您对构建过程了如指掌。 Makefile变量:深入理解Makefile中的变量,包括自定义变量、系统环境变量和预定义变量,它们是Makefile中的强大工具,帮助您编写更加灵活和通用的构建脚本。 实践案例: 从简单的Makefile实例到复杂的项目依赖管理。 使用预定义变量如$@、$*、$<等,让您的Makefile更加智能和自动化。

2024-08-24

深入Linux编程核心:GCC与GDB工具详解

Linux系统的强大不仅在于其稳定性和灵活性,更在于其丰富的编程工具。《Linux下编程工具(gcc、gdb)》为您提供了一个全面深入的视角,探索GCC编译器和GDB调试器的高级使用技巧。 GCC编译器:作为GNU编译器套装的核心,GCC支持多种编程语言,包括C、C++、Java等。从预处理器到链接器,GCC的组件协同工作,将源代码转化为可执行程序。了解GCC的编译选项,如-o、-Wall、-O级别优化等,将极大提升您的开发效率。 GDB调试器:GDB是GNU工具集中的调试器,一个交互式工具,它帮助开发者深入理解程序的运行机制。通过设置断点、监视变量、单步执行等操作,GDB让调试过程变得直观和可控。 动态库与静态库:深入理解动态库和静态库的制作与使用,掌握如何根据项目需求选择合适的链接方式。动态链接库的灵活性与静态链接库的稳定性,两者各有千秋。 工程管理:结合make工具,实现项目的自动化构建,提高开发流程的效率。 本资源适合所有Linux开发者,无论您是初学者还是资深工程师,都能从中获得宝贵的知识。丰富的实例和详细的命令解析,将使您在Linux编程的道路上更加自信。

2024-08-24

掌握Linux编程核心:Shell脚本与工具使用指南

探索Linux编程世界,深入了解其强大的shell脚本编程能力!本资源《Linux下编程工具(shell脚本)》为您揭开Linux环境下编程的神秘面纱,从基础的文件结构到复杂的脚本编写,一网打尽! Linux环境开发概述:快速了解Linux开发环境的搭建与配置,为高效编程打下坚实基础。 文件与目录结构:深入Linux的文件系统,掌握文件与目录的组织与管理。 Linux常用命令:精选实用命令,提高您的工作效率,让您在命令行中游刃有余。 文本编辑器vi+gedit:掌握两款强大的文本编辑器,让代码编辑更加得心应手。 Shell脚本编程:深入浅出地讲解shell脚本的定义、执行和高级编程技巧,让自动化任务变得简单。 编译器gcc与调试器gdb:学习如何使用gcc编译代码,以及利用gdb进行程序调试,确保代码质量。 工程管理软件make:自动化构建工具make的使用,让项目构建更加高效。 本资源适合嵌入式系统工程师、Linux开发者以及所有希望提升Linux编程技能的技术人员。内容丰富、讲解透彻,是您Linux编程学习之路上的得力助手。

2024-08-24

深入探索Linux世界:《Linux下编程工具(概述、目录结构)》精粹指南

【正文】 Linux,这个强大的操作系统,一直是程序员和系统管理员的得力助手。《Linux下编程工具(概述、目录结构)》PDF文档,将带您深入理解Linux的编程环境、文件系统结构及核心概念。 【资源亮点】 Linux开发环境概述:从Windows到Linux,了解Linux开发的特点和工具。 文件及目录结构:深入Linux的树状文件系统结构,掌握其核心目录和文件类型。 常用命令与文本编辑器:探索Linux命令行的强大功能,学习使用vi和gedit编辑器。 Shell脚本编程:开启自动化脚本编程的大门,简化日常任务。 编译器gcc与调试器gdb:掌握程序编译和调试的核心工具。 工程管理软件make:高效管理项目构建过程。 【内容概览】 Linux开发环境:比较Windows与Linux开发环境,理解Linux开发的优势。 文件系统结构:详细解析FHS标准,从根目录到各子目录的功能。 命令行艺术:学习使用Linux命令行进行文件操作、程序编译和调试。 编辑器使用:掌握vi和gedit文本编辑器,提高编程效率。 Shell脚本与自动化:编写Shell脚本,自动化复杂任务。

2024-08-24

精通Linux命令行:《Linux下编程工具(Linux命令、vi)》教程全解析

【正文】 Linux,作为开源世界的佼佼者,其强大的命令行功能一直是开发者和系统管理员的得力工具。本次分享的资源《Linux下编程工具(Linux命令、vi)》PDF,将带您深入探索Linux命令行的精髓,以及高效文本编辑器vi的使用技巧。 【资源亮点】 Linux命令全解:从基础到高级,系统性地介绍了Linux常用命令,包括文件管理、磁盘操作、权限设置等。 命令行效率提升:详细讲解了命令的自动补全、历史命令回顾、重定向和管道操作,极大提升命令行使用效率。 文本编辑器vi深度解析:vi作为Linux下功能强大的文本编辑器,本文档提供了全面的使用指南和技巧。 vi插件ctags集成:介绍了如何安装和配置vim和ctags,让您在代码编辑中游刃有余。 实战演练:通过具体的命令行练习,加深对Linux命令和文本编辑器操作的理解。 【内容概览】 Linux命令行基础:详细介绍了Linux命令的格式、使用技巧和实用命令。 文件和磁盘管理:包括ls、tree、df、du等命令的使用和参数配置。 用户和权限管理:涵盖了adduser、deluser、passwd、chmod、chown等命令。

2024-08-24

掌握Linux开发环境搭建:Ubuntu系统安装与配置全指南

Linux作为开源界的佼佼者,一直是开发者和系统工程师的首选操作系统。本次分享的资源《Linux开发环境搭建—Ubuntu》PDF文档,将带领大家一步步搭建起高效、稳定Ubuntu开发环境。 【资源亮点】 系统安装方案:详细介绍了光驱安装、USB安装、硬盘安装、服务器安装和虚拟机安装等多种Linux系统安装方案。 虚拟机技术:探讨了虚拟机技术的作用和优势,以及如何在虚拟机中安装Ubuntu系统。 Ubuntu使用指南:从Unity桌面环境的使用到Dash搜索栏的操作,全面覆盖了Ubuntu的基本操作和个性化配置。 软件包管理:深入讲解了Ubuntu软件包的获取、更新和管理,以及如何通过命令行和图形界面进行软件的安装和更新。 必备软件安装:包括Samba和SSH服务器的安装与配置,以及如何在Windows环境下使用Xshell远程登录Linux。

2024-08-24

深入探索操作系统的演变:从无到有,Linux的崛起与未来

操作系统作为计算机世界的基石,其发展历程充满了变革与创新。本次分享的资源《操作系统发展及Linux介绍》PDF文档,将带领大家穿越时光,深入了解操作系统的演变历程,特别是Linux操作系统的诞生、发展以及其在现代技术领域的广泛应用。 【资源亮点】 历史脉络清晰:从无操作系统时代到现代主流操作系统的演进,为您梳理了操作系统发展的清晰脉络。 Linux深度解析:详细介绍了Linux操作系统的起源、内核、发行版以及在不同领域的应用实例。 技术与应用并重:不仅探讨了Linux的技术特性,还展示了其在个人桌面、服务器和嵌入式领域的广泛应用。 开源精神传承:文档中对自由软件运动和开源社区的贡献给予了高度评价,彰显了开源精神在推动技术进步中的重要性。 【内容概览】 操作系统的目标与功能:深入理解操作系统的设计目标和核心功用。 操作系统的演变历程:从早期的单任务、单用户操作系统到现代的多任务、多用户系统。 Linux操作系统:探索Linux的起源,了解其如何成为最受欢迎的自由电脑操作系统内核。 内核与发行版:剖析Linux内核的发展历程和多样化的发行版生态。

2024-08-23

学生信息管理系统项目答辩PPT

C++实训项目:学生信息管理系统 在当今数字化时代,教育行业对学生信息管理的需求日益增长。我们团队在C++实训项目中,精心设计并开发了一款学生信息管理系统,旨在为学校提供一个高效、便捷的信息管理解决方案。 项目背景与目的 随着国内高等教育的蓬勃发展,学生数量的激增给学校管理带来了诸多挑战。我们的系统利用计算机技术,提供了一种优于传统手工管理的方法,具有检索迅速、查找方便、可靠性高等特点,极大地提升了学生档案管理的效率。 技术亮点 编程语言:C++,一种功能强大的编程语言,确保了系统的高效运行。 开发环境:CodeBlocks,一个稳定且易于使用的集成开发环境。 云服务支持:华为云,为我们的系统提供了可靠的数据存储和处理能力。 功能特色 用户登录:系统提供角色权限选择,确保用户安全登录。 主菜单:用户可根据不同需求,通过数字选择进行学生信息的相应操作。 系统界面 我们的系统运行界面直观、友好,便于用户快速上手。 项目总结 虽然在项目开发过程中,我们遇到了一些挑战,如学生权限操作功能的缺失和密码安全性问题,但这些经历为我们提供了宝贵的学习机会。我们期待在未来的学习和实践中,不断完善。

2024-08-23

操作系统镜像刻录工具rufus

通过使用此工具,可将操作系统镜像刻录至U盘中,用于系统镜像安装。

2024-08-23

学生信息管理系统的设计与实现

本项目让我们获得一个更好的办法来管理学生的信息资料,将学生信息都采用线上的方法来处理。让处理学生个人信息的老师有资格审查学生的个人情况信息。这种方法不但缓解了学生信息处理人的压力,而且降低了在管理的时候由于各种原因所造成错误的概率。本项目的功能包括可以创建、增添、删除、保存学生的个人信息,插入存储学生的个人信息、对已录入学生按成绩排序、对已录入信息的学生进行统计等。项目按流程进入程序,首先未注册的用户会提示用户注册然后进行登录,已注册过的用户可通过账户进行登录,随后进入功能菜单。本设计共计12项子功能,分别是创建学生信息、增添学生信息、删除学生信息、查找学生信息、插入学生信息、显示学生信息、修改学生信息、按照学生的成绩进行排序、将录入的学生信息进行保存、将所保存的学生信息进行读取、退出当前读取的学生信息、统计已录入系统的学生信息。

2024-08-22

空空如也

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

TA关注的人

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