- 博客(58)
- 收藏
- 关注

原创 C语言泛型 _Generic
泛型编程是一种编程范式,它允许程序员在编写代码时使用一些将来才会指定的类型。这些类型在代码实例化时作为参数指明。例如,在 C++ 中,可以通过模板来支持泛型编程。通过使用_Generic关键字,C 语言可以在一定程度上实现泛型编程,使程序更加灵活和通用。然而,需要注意的是,_Generic的使用仅限于编译时类型选择,而且表达式只是简单的宏替换。此外,对于复杂的类型和多种参数组合,还需要进一步考虑如何正确处理不同类型之间的转换。GarenJian。
2024-09-10 22:45:49
1300

原创 4.Rust所有权
这期我们将带来所有权(Ownership)的相关知识,所有权是Rust很重要的一个概念,必须好好掌握哟!一、内存安全对于C/C++程序员来说,可能一直在跟内存安全打交道,这对我们来说也是一个不可避免的问题,我在面试过程中,90%的面试官都对这个问题深入地提了问题。内存泄漏呀、智能指针呀什么的,如果有人感兴趣的话可以专门针对C++中的内存安全问题专门写一期文章,后台留言告诉我哈。对于一些别的语...
2020-04-04 23:53:42
870
原创 你还在用rand()生成随机数?
TPM 是一种专门设计用于增强计算机安全性的硬件组件,它提供了一系列的安全功能,其中包括密码学操作、密钥生成和存储等。这些方法确保了生成的随机数具有足够的不可预测性和随机性,以满足加密应用的需求。CSPRNG 是专门为加密应用设计的伪随机数生成器,它们的特点是即使攻击者知道部分输出或状态,也很难推断出未来的输出。许多现代操作系统都提供了专门用于获取高熵随机数据的接口,这些接口通常被认为是安全的,因为它们从多个难以预测的硬件和软件事件中收集熵。实现生成的数字周期较短,且这些数字是可以预测的。
2024-12-30 22:40:22
727
原创 LeetCode7. 整数反转
给你一个 32 位的有符号整数x,返回将x中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围,就返回 0。
2024-12-29 21:41:11
400
原创 LeetCode 9. 回文数
给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。121123**进阶:**你能不将整数转为字符串来解决这个问题吗?
2024-12-29 20:34:08
441
原创 链表排序算法
对于数组排序,我们有十八般武艺,冒泡、选择、插入、归并、快排、堆排、希尔排。那么对于链表应该如何进行排序呢?首先上结论,链表排序应该使用归并排序。为啥呢?
2024-12-24 08:30:00
317
原创 C语言安全编程:避免在不安全的宏参数中出现副作用
副作用是指表达式的求值除了计算出一个结果外还修改了程序状态的操作。例如,改变变量的值、进行输入输出操作等都是副作用的例子。在C语言中,副作用通常出现在赋值运算符、增量和减量运算符(如++和--)、函数调用以及逗号运算符中。
2024-12-23 21:58:12
631
原创 C/C++位运算:如何高效修改指定位
位被设置为 1,而不改变其他位的值。(二进制表示),并且你想要清除第3位(是 3,那么函数返回的结果将是。因此,这个函数的作用是确保。,这样第3位就被清除了。
2024-12-20 20:11:45
821
原创 C语言redis存储结构体
假设我们有一个复杂的结构体,包含嵌套的结构体和数组。通过将复杂结构体序列化为 JSON 字符串,可以方便地使用 Redis 存储和检索这些结构体。hiredis库用于与 Redis 服务器进行通信,而jansson库用于处理 JSON 序列化和反序列化。这种方法不仅简单,而且灵活,适用于各种复杂的结构体。
2024-12-19 22:24:31
203
原创 注意C语言对象生命周期
在C语言中,一个对象的生命周期是指程序执行期间为其保留存储空间的那个部分。一个对象在其生命周期内存在,具有一个固定的地址,并保持其最后存储的值。如果在一个对象的生命周期之外引用它,其行为是未定义的。如果一个指针值在它指向的对象(或者刚好在对象之后)生命周期结束时之后的计算中使用,其行为也是未定义的。
2024-12-17 00:45:04
330
原创 LeetCode 4. 寻找两个正序数组的中位数
不过也还是可以掌握一下,因为有时候机考,你能过用例就行,那么如果面试的时候,你用那种方法,面试官可能都惊呆了,他可能会以为你以为他是个傻*。因此,我们需要找到第 (m+n+1)/2 个数(奇数情况)和第 (m+n+2)/2 个数(偶数情况),其中 m 和 n 分别是两个数组的长度。:要找出第k小的数,初始化数组指针为k/2,此时两个指针右边的数其实是k个,比较两个数组k/2位置的数值,如果其中一个小,则将其左边的值全部抛除,更新指针,始终保证两个指针右边的数加起来有一半的数量,继续比较。
2024-12-16 22:42:48
220
原创 C语言可变参数函数和可变参数宏
可变参数函数的定义通常包含一个固定参数列表,后面跟着一个省略号...。省略号表示可以有任意数量的附加参数。// 定义一个可变参数函数return 0;
2024-09-13 13:53:57
630
原创 strncpy陷阱
相比于strcpy来说,strncpy具有更高的安全性,但是同时会带来一个问题,就是c字符串不会自动补’\0’。最近遇到了一个strncpy的bug,他们居然说这不是bug,而我认为这是很严重的bug!当然如果你本身处理的是bit流,则可以不考虑这个因素。在我们对c字符串进行处理的时候,一定要加上’\0’。很显然,这是由于没有添加’\0’。废话不多说,直接上代码!
2024-09-10 22:49:51
303
1
原创 C++全局变量和静态变量析构函数的执行时机
在C++中,对于局部变量,当局部变量的生命周期结束时,会自动调用析构函数。但是对于全局变量和静态变量来说,其生命周期较长,其析构函数将会在什么时机进行调用呢?让我们来探究一下。我们先看下面的一段程序:#include <iostream>#include <cstdlib>#include <string>class Static {public: Static() { std::cout << "Static
2022-04-25 22:41:57
3615
2
原创 WebAssembly基础
01 探索WebAssembly1.1.1 什么是WebAssembly?现在我们可以做出相当大胆的断言:WebAssembly就 是分布式计算的未来。这是一个非常崇高的目标,如果没有一些证据来支持它就没什么意义了。我们将提供一些证据,但首先让我们深入了解 WebAssembly 本身的一些细节。我们首先需要消除 WebAssembly 只能在 Web 上运行或者它以某种方式设计为仅在 Web 浏览器范围内运行的虚拟机这种既新颖又有些陈旧的思想。我们现在可以说,“WebAssembly 既不是网络也不是
2021-09-27 12:47:31
866
原创 全世界最简单的Rust开发环境配置
全世界最简单的Rust开发环境配置1. 安装vs2017或vs20192. 下载Rustup运行安装Rust3. vscode安装插件rust-analyzer、CodeLLDB、Better TOML、crates4. 测试cargo new test_01通过vscode打开test_01文件夹等待安装rust-analyzer server等组件点击侧边栏Run和Debug,会提示没有配置,然后会提示根据toml文件生成配置文件,选择是一切就绪后,此后运行和调试就更加方便了...
2021-08-02 23:42:45
586
原创 斐波拉契数列完全解析(C++)
斐波拉契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.暴力递归int fib(int n){ if (n == 0) return 0; if (n == 1 || n == 2) return 1; return fib(n-1) + fib(n-2);}我们画一个图来演示一下fib(5)的计算过程:可以发现有很多重复计算,所以这种方式效
2021-08-02 23:39:07
1047
2
原创 凑零钱问题(C++)
凑零钱问题:给定k种面值的硬币,分别是c1,c2, … , ck,每种硬币的数量无限,请问最少需要多少枚硬币可以凑出总金额total,如果凑不出将返回-1.暴力递归举例:当总金额是23,硬币面值为1,2,5首先最简单的就是当总金额是0时,需要0枚硬币。当我们选择一枚1元硬币时,就等于总金额为22时的最小硬币数加1。int leastCoinNum(std::vector<int>& coins, int n){ if (n == 0) return
2021-08-02 23:36:55
1626
原创 全世界最简单的Rust开发环境配置
1. 安装vs2017或vs20192. 下载Rustup运行安装Rust3. vscode安装插件rust-analyzer、CodeLLDB、Better TOML、crates4. 测试cargo new test_01通过vscode打开test_01文件夹等待安装rust-analyzer server等组件点击侧边栏Run和Debug,会提示没有配置,然后会提示根据toml文件生成配置文件,选择是一切就绪后,此后运行和调试就更加方便了...
2021-06-27 10:18:44
402
原创 1. 什么.Net?什么是C#?
相信对很多人来说.net并不陌生,因为windows系统中经常遇到提示"请安装.net framework 4.0"之类的提示,那么我们接下来接下来介绍一下集中容易混淆的名词。什么是.net?什么是.net?如何你想知道什么是.net的话?我就带你研究!1. 什么是.net framework? 如我们所知,.net framework是与windows操作系统有关的一个东西,而且是微软推出的。 .net framework开发平台包括公共语言运行库(CLR)和基类库(BCL),CLR负责管理
2021-05-11 23:56:36
330
原创 2. C#变量和数据类型
1. 准备开发环境1.1 Visual Studio C#是微软的亲儿子,那么开发工具当然首推宇宙第一好用也是宇宙第一复杂的究极变态牛逼的Visual Studio进行开发。 首先下载Visual Studio并安装,目前版本推荐Visual Studio 2019,不过2022版本即将出预览版随之就是正式版,总之就是推荐最新的。最新版本性能更优,功能更全更方便且bug更少,且据说Visual Studio 2022将是64位版本,使用起来将会更加流畅,不会因为工程较大,因为内存问题卡顿了。
2021-05-11 23:55:12
360
原创 C#深拷贝
深拷贝与浅拷贝是很多语言都有的概念,在C#中也不例外1. 深拷贝与浅拷贝深拷贝与浅拷贝的区别就是在拷贝的时候是否会建立一个新的对象实体还是引用。而比较直观的就是浅拷贝时,修改拷贝对象的值会改变原对象的值,因为他们在内存里仍然是同一块区域,而浅拷贝修改拷贝对象的值并不会影响原对象的值。在Python中有copy和deepcopy方法,在c++中可以通过重载构造函数和等号实现拷贝的实际行为,在Rust可以通过trait实现复制语义和移动语义,当然移动语义和复制语义有别于深拷贝与浅拷贝。那么Rust中如何
2021-03-07 20:18:30
2403
1
原创 C++程序员Linux子系统使用指南
Linux C++程序员当然必不可少的就是Linux环境配置,我们大多数人使用的电脑都是Windows系统,如何在Windows上开发linux程序呢?通常我们可以由很多方式来选择,这里我推荐一种Windows下Linux子系统的方式,非常滴方便!感兴趣的可以尝试一下~1.准备工作首先需要将开发人员模式打开设置->更新和安全->开发者选项->勾选开发人员模式然后在程序...
2020-04-25 01:08:06
325
原创 9.Rust错误处理
错误处理是程序开发中必不可少的一个环节,在Rust中,错误分成两个类别:可恢复错误和不可恢复错误。可恢复错误:比如说未找到文件,Rust中用Result<T,E>来实现不可恢复错误:比如数组访问越界,Rust中用panic!实现1.panic!这个有感叹号,很显然是一个宏,我们来使用一下子。fn main() { panic!("panic here!");}报...
2020-04-22 20:26:58
1842
原创 8.Rust模式解构
模式解构—Pattern Destructure,其对应的就是模式构造,因此模式解构是将原本组合起来的结构分解为单独的、局部的、原始的部分。1.模式解构示例我们之前在学习tuple时,写过类似以下例子:fn main() { let t = (1, 's', "白质".to_string()); let (t_one, t_two, t_tree) = t; prin...
2020-04-16 23:34:01
1030
原创 7.Rust的trait
trait可以暂时先翻译为“特征”,也可以不翻译吧,就叫trait。1.trait的定义和实现//定义traitpub trait GetInfo { fn get_name(&self) -> &String; fn get_index(&self) -> i32;}//定义学生结构体pub struct Student { ...
2020-04-14 00:15:59
745
原创 6.Rust中的泛型
相信很多C++程序员对泛型编程是非常熟悉的,我本来也是觉得不需要再特别介绍泛型这部分,因为其实都大同小异。但是考虑到部分读者可能不太熟悉,所以还是专门用一期来介绍泛型。一、什么是泛型编程C/C++、Rust都是强类型语言,在对数据进行处理时,必须明确数据的数据类型。但是很多时候,比如链表这种数据结构,我们可以是整型数据的链表,也可以是其他类型,我们可能就会写出重复的代码,仅仅是数据类型不同而已...
2020-04-11 20:39:48
1307
原创 5.Rust中常用的复合数据类型
一、数组1.数组创建一段连续空间中,存储了同类型的数据。fn main() { let mut arr1 = [0, 1, 2, 3 ,4 ,5]; let mut arr2 = [1 ; 6]; //创建大小为6,元素都是1的数组 arr1 = arr2; //arr和arr2是同大小和同数据类型,在Rust中是同一类型,因此可以相互赋值 printl...
2020-04-07 22:48:42
571
原创 2.Rust编程初体验
本入门系列教程将不会按照常规的方式进行,本教程主要以代码入手,先敲代码,再讲知识点。所谓,先“知其然”,再“知其所以然”,欢迎共同探讨,多多指正。下面先以两个简单的程序对Rust语言有一个初步的体验。Code 1. Hello Worldfn main(){ println!("Hello, world!");}运行输出:Hello, world!和C++类似,程序的入口需要一个...
2020-04-02 16:36:02
1838
原创 3.Rust通用编程概念
这期我们将会介绍一些通用的编程概念(也就是通常编程语言都有的东西),如数据类型、函数、控制流等一、变量和数据类型1.Rust的关键字首先我们先介绍一下Rust的关键字,在变量命名时以免冲撞~[Keywords Currently in Use]The following keywords currently have the functionality described.as - ...
2020-04-02 16:33:05
1201
原创 零基础C++后台开发学习路线
个人介绍:首先介绍一下自己吧,我是一名非科班硕士,本硕某985,本科对于编程这块的学习很浅显,数据结构都没学过,基本上到了研一才开始认真学习这块知识。这篇文章实际上是我自己入门编程过程的总结,在大学期间对于c++,java等编程语言的学习比较迷茫,也走过一些弯路,比如盲目刷题,明明不懂却靠记住代码去满足自己的收获感,一路走来,踩了很多坑,下面分享一下我自己总结的学习路线,希望能够帮助到大家。本...
2020-03-16 16:48:45
2421
5
原创 1.Rust环境配置和IDE的选择
Rust语言简介:Rust是一门系统编程语言 ,专注于安全,尤其是并发安全,支持函数式和命令式以及泛型等编程范式的多范式语言。Rust在语法上和C++类似,但是设计者想要在保证性能的同时提供更好的内存安全。一、安装Rust通过rustup安装,https://rustup.rs/rustup可以安装Rust相关的一整套工具链,包括编译器、标准库、cargo等,安装较慢的话,可以试试科学上网...
2020-03-15 22:58:29
9831
1
原创 条件变量
条件变量本身不是锁,但是它仍然可以造成线程阻塞,它通常需要与互斥锁进行配合使用。1.linux接口函数#include <pthread.h>//初始化及销毁条件变量int pthread_cond_destroy(pthread_cond_t *cond);int pthread_cond_init(pthread_cond_t *restrict cond, const ...
2019-11-14 00:15:11
205
原创 C++常见面试题及详细解答(C++基础)
1.关于c++内存对齐内存对齐原因:(1). 平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。(2). 性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问#include <cassert>...
2019-09-08 21:12:10
2370
原创 手撕合集
冒泡void bubbleSort(vector<int>& arr){ int n = arr.size(); while(n != 0) { for(int i = 1; i < n; i++) { if(arr[i] < arr[i - 1]) ...
2019-08-14 00:59:31
431
原创 LeetCode147. 对链表进行插入排序 c++
取巧(作弊)做法:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ...
2019-07-10 13:01:41
160
原创 LeetCode150. 逆波兰表达式求值 c++
根据逆波兰表示法,求表达式的值。有效的运算符包括+,-,*,/。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例1:输入: ["2", "1", "+", "3", "*"]输出: 9解释: ((2 + 1) * 3) = 9示例2:...
2019-07-09 15:00:50
347
原创 LeetCode33. 搜索旋转排序数组 c++
假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组[0,1,2,4,5,6,7]可能变为[4,5,6,7,0,1,2])。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回-1。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是O(logn) 级别。示例 1:输入: nums = [4,5,6,7,0,1,2]...
2019-07-05 19:50:46
386
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人