
C/C++
文章平均质量分 70
helloworddm
这个作者很懒,什么都没留下…
展开
-
Python 打破次元壁:畅连 DLL
还有一种方式就是通过pyd,在c++侧来进行调用。那种方式更好,要根据具体的场景来定。如果有很多状态在c++代码里面设置,而调用的时候又需要这些状态,那就应该写在C++侧。通过python直接调用dll。包括对指针的传递以及返回的处理。原创 2025-02-24 17:31:44 · 174 阅读 · 0 评论 -
Windows 64位参数传递规则
对于汇编语言,个人觉得更多的需要的是耐心,不像高级语言那样有繁杂的语法体系。在和中讲解了函数调用过程以及参数传递的方式,本文从汇编层面说一下Windows下x64的参数调用相应的规则。通过汇编能让你更彻底的了解到底什么是指针,参数如何传递的。原创 2025-02-09 17:36:35 · 545 阅读 · 0 评论 -
Python 秒变 “快枪手”:媲美 C 语言速度的秘密武器
在C#中,有native aot,可以将c#代码直接转化为c++,加快了启动速度和反编译的难度,而在python中也有一个类似的工具–。给的定义: Nuitka the Python Compiler。原创 2025-01-26 13:10:14 · 503 阅读 · 0 评论 -
Android 编译和使用libpng
使用上面的命令编译报错,从错误中推测应该需要zlib依赖,还需要下载zlib,由于Android自带zlib库,遂使用cmake进行。修改libpng中CmakeLists.txt中的add_library,修改为动态共享库。从上面的信息中可以看出libpng是一个历史悠久的处理png的库,需要zlib依赖。这个路径是clone下来的libpng中CmakeLists.txt所在的目录。更多内容,欢迎关注我的微信公众号: 半夏之夜的无情剑客。使用下面的命令可以直接编译为静态库。原创 2023-09-08 09:46:40 · 650 阅读 · 0 评论 -
鸿蒙系统的js代码是如何工作的(2)-sensor NAPI层源码解读
sensor中C++部分代码位于base/sensors/sensor下面。ts定义位于interface/sdk-js/api/@system.sensor.d.ts。中介绍了ts接口和C++ NAPI层的对应关系,以及Promise和callback方式对应的代码实现,这里不再展开。原创 2023-08-23 13:26:50 · 228 阅读 · 0 评论 -
黑客攻击-深入理解socket
声明:谢绝一切形式的转载socket套接字socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现, socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭). 说白了Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模原创 2020-07-01 23:37:24 · 1146 阅读 · 0 评论 -
scanf函数分析
概述scanf()是C语言中的一个输出函数。与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include <stdio.h>。(在有一些实现中,printf函数与scanf函数在使用时可以不使用预编译命令#include <stdio.h>。)它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。定义int scanf(const char * restrict format,...);函数 scanf() 是原创 2020-06-26 00:24:52 · 534 阅读 · 0 评论 -
格式化字符串漏洞-手动触发
漏洞原因程序使用了格式化字符串作为参数,并且格式化字符串为用户可控。其中触发格式化字符串漏洞函数主要是printf、sprintf、fprintf、prin等C库中print家族的函数。出现漏洞的代码正常的代码://gcc test.c -o test -m32#include<stdio.h>//#include<stdlib.h>//#include<string.h>/*int test(int a,int b){ //int len原创 2020-05-23 01:20:56 · 308 阅读 · 0 评论 -
字符串的包含
给定一长字符串a和一短字符串b,请问如何最快地判断出短字符串b中的所有字符是否都在字符串a中。解法一:蛮力轮询:时间复杂度O(M*N);解法2:排序轮询:时间复杂度O(mlongm)+O(nlongn)+O(m+n);解法3:素数相乘:时间复杂度为O(M+N),乘积可能过大解法4:位运算c++代码如下: 点击(此处)折叠或打开原创 2017-08-06 18:14:31 · 486 阅读 · 0 评论 -
字符串的排列组合
题目描述: 输入一个字符串,打印出该字符串中字符的所有排列。 基本思路: 从字符串中选出一个字符作为排列的第一个字符,然后对剩余的字符进行全排列,如此递归,从而得到所有字符的全排列。以对字符”abc”进行全排列为例,可以按下述步骤执行: 将a固定在第一位,求后面bc的排列 将b固定在第一位,求后面ac的排列 将c固定在第一位,求后面ab的排列#include #in原创 2017-08-06 18:14:34 · 482 阅读 · 0 评论 -
经典排序算法之堆排序
堆排序 堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。 1.堆 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆,满足Key[i]原创 2017-08-06 18:14:36 · 271 阅读 · 0 评论 -
经典排序算法之归并排序
点击(此处)折叠或打开 #includeiostream> using namespace std; int *aux = NULL; void sort(int *a,int,int); void merge(int *a,原创 2017-08-06 18:14:39 · 286 阅读 · 0 评论 -
行列递增矩阵的查找
题目描述:在一个m行n列的二维数组中,每一行都按照从左到有的递增顺序排列,每一列都按照从上到下递增顺序排列。现输入这样一个二维数组和整数,判断该数组是否含有该整数!O(m+n) 点击(此处)折叠或打开 #includeiostream> using namespace std;原创 2017-08-06 18:14:53 · 450 阅读 · 0 评论 -
排序算法稳定性
【1】选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法 冒泡排序、插入排序、归并排序和基数排序都是稳定的排序算法。 【2】研究排序算法的稳定性有何意义? 首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前两个相等的数据其在序列中的先后位置顺序与排序后它们两个先后位置顺序相同。 再简单具体一点,如果A i == A j,Ai 原来在原创 2017-08-06 18:15:04 · 249 阅读 · 0 评论 -
构造函数的细节
点击(此处)折叠或打开 #includeiostream> using namespace std; class A { public: A(){cout "Hello world\n";}原创 2017-08-06 18:15:07 · 358 阅读 · 0 评论 -
动态链接库
1 静态链接库的优点 (1) 代码装载速度快,执行速度略比动态链接库快; (2) 只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题,可避免DLL地狱等问题。 2 动态链接库的优点 (1) 更加节省内存并减少页面交换; (2) DLL文件与EXE文原创 2017-08-06 18:15:13 · 288 阅读 · 0 评论 -
京东
点击(此处)折叠或打开 // sa.cpp.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #includeiostream> #include cstdi原创 2017-08-06 18:15:19 · 479 阅读 · 0 评论 -
strtok函数应用
char *strtok(char s[], const char *delim); 点击(此处)折叠或打开 #includeiostream> #includestring.h> #includestring> using nam原创 2017-08-06 18:15:42 · 362 阅读 · 0 评论 -
strncpy的实现
华为面试题:char *mystrcpy(char *dest,char *src,int n){ char *newdest = dest; assert((dest != NULL) && (src != NULL)) while (n &&((*dest++ = *src++) != '\0')) { n--; }原创 2017-08-06 18:15:45 · 1080 阅读 · 0 评论 -
C语言中 .h文件和.c文件的区别
要理解.c文件与.h文件有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:1.预处理阶段2.词法与语法分析阶段3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用objcopy生成纯二进制码,也就是去掉了文件格式信息...原创 2017-08-06 18:16:12 · 65227 阅读 · 3 评论 -
为什么用#ifdef _DEBUG
#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif在MFC中,可以使用DEBUG_NEW宏代替new 运算符来帮助定位内存泄漏。在程序的“Debug”版本中,DEBUG_NEW 将为所分配的每个对象跟踪文件名和行号。当编译程序的“Release”版本时,DEBUG_N原创 2017-08-06 18:17:29 · 709 阅读 · 0 评论 -
最长公共子序列运用
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?输出需要删除的字符个数。思路:将原字符串反转,求出元字符串与反转字符串最长公共子序列(也就是最长的回文串);c++代码(网上搜的): 点击(此处)折叠或打开 #include bits/stdc++.h>原创 2017-08-06 18:17:49 · 715 阅读 · 0 评论 -
虚函数的实现机制图示
c++规定了虚函数的行为,但将实现留给了编译器作者,不需要知道实现方法就可以使用虚函数,但了解虚函数的工作原理有助于更好的理解概念。 通常编译器处理虚函数的方法是:给每个对象添加一个隐藏成员,隐藏成员中保存了一个指向函数地址数组的指针。这种数组称为虚函数表。 虚函数表中存储了为类对象进行声明的虚函数的地址。例如:基类对象包含一个指针,该指针指向基类中所有虚函数的地址表。派生类对...原创 2017-08-06 18:17:52 · 549 阅读 · 3 评论 -
笔试题(1)
2016.9.4分针和时针每隔(12/11)小时重合一次,一个钟面上分针和时针一昼夜重合(22)次360 除以 (6-1/2) = 12/11小时24除以12/11 = 22本题考查钟表分针所转过的角度计算.钟表里的分钟与时针的转动问题本质上与行程问题中的两人追及问题非常相似.行程问题中的距离相当于这里的角度;行程问题中的速度相当于这里时(分)针的转动速度.2016.8.16原创 2017-08-06 18:18:16 · 412 阅读 · 0 评论 -
字符串编辑距离
举例如下: j = 0 f a i l原创 2017-08-06 18:10:32 · 210 阅读 · 0 评论 -
经典排序算法之冒泡排序
基本思路:比较表中的相邻元素,如果他们是逆序的话就交换他们的位置。重复多次以后,最终最大的元素就沉到列表的最后一个位置,第二遍操作将第二大的元素沉下去,这样一直做,知道n-1遍以后,该列表就排好序了。代码如下: 点击(此处)折叠或打开 #includestdio.h> #inc原创 2017-08-06 18:14:20 · 284 阅读 · 0 评论 -
linux下C和shell调用的popen函数
说明: 本文介绍popen函数的使用方法和行为机理,并给出实际的例子来辅助说明了popen函数的使用方法。popen函数使用FIFO管道执行外部程序,首先让我们看看popen的函数原型吧:#include FILE *popen(const char *command, const char *type);int pclose(FILE *stream); popen 通过ty原创 2017-08-06 18:14:14 · 297 阅读 · 0 评论 -
查找指定字符串在某个字符串中的出现次数
c语言代码实现: 点击(此处)折叠或打开 #includestdio.h> #includestring.h> int searchnum(char *str,char *pattern) {原创 2017-08-06 18:14:09 · 2125 阅读 · 1 评论 -
linux下静态库和动态库的区别
一、引言我们通常把一些公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。通常情况下,对函数库的链接是放在编译时期(compile time)完成的。所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file)。程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到相应目录下下。所以这些函数库被成为静态原创 2017-08-06 18:11:17 · 587 阅读 · 0 评论 -
ptrace的些许总结
所有的操作系统都提供多种服务的入口点,由此程序向内核请求服务,各种版本的 unix 实现都提供良好定义,数量有限,直接进入内核的入口点,这些入口点被称为系统调用。内核的接口被称作系统调用。实际上 Linux 提供了一种优雅的机制来完成这些:ptrace 系统函数。 ptrace 提供了一种使父进程得以监视和控制其它进程的方式, 它还能够改变子进程中的寄存器和内核映像, 因而可以原创 2017-08-06 18:11:14 · 1113 阅读 · 0 评论 -
C++基础(五)虚函数、重载、覆盖、隐藏
虚函数总是跟多态联系在一起,引入虚函数可以使用基类指针对继承类对象进行操作!虚函数:继承接口(函数名,参数,返回值),但是实现不继承(函数体) 非虚函数:继承接口,也继承实现; 1)虚析构函数(当一个类打算作为基类使用时候,其析构函数必须是虚函数) 构造函数可以为虚函数吗? 不可以,在生成对象的时候,必须向编译器明...原创 2017-08-06 18:11:05 · 721 阅读 · 0 评论 -
getopt_long
文件#include 函数原型int getopt_long(int argc, char * const argv[],const char *optstring,const struct option *longopts, int *longindex);函数说明getopt被用来解析命令行选项参数。getopt_long支持长选项的命令行解析,使用man ge原创 2017-08-06 18:10:50 · 295 阅读 · 0 评论 -
STL vector实现机制
vector的数据安排以及操作方式与array非常类似。两者的唯一差别在于空间的运用的灵活性。array是静态空间,一旦配置好了就不能再改变了。如果程序需要一个更大空间的array,只能自己再申请一个更大的array,然后将以前array中的内容全部拷贝到新的array中。vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新的元素。vector的关键技术在于其对大原创 2017-08-06 18:10:35 · 398 阅读 · 0 评论 -
C++STL学习经典
C++语言学习之STL 的组成STL有三大核心部分:容器(Container)、算法(Algorithms)、迭代器(Iterator),容器适配器(container adaptor),函数对象(functor),除此之外还有STL其他标准组件。通俗的讲:容器:装东西的东西,装水的杯子,装咸水的大海,装人的教室……STL里的容器是可容纳一些数据的模板类。算法:就是往杯子里倒水,往大海原创 2017-08-06 18:09:29 · 2858 阅读 · 0 评论 -
c语言中的输入函数
scanf( )函数和gets( )函数都可用于输入字符串,但在功能上有区别。若想从键盘上输入字符串"hi hello",则应该使用gets函数。 gets可以接收空格;而scanf遇到空格、回车和Tab键都会认为输入结束,所有它不能接收空格。 char string[15]; gets(string); /*遇到回车认为输入结束*/ scanf("%s"原创 2017-08-06 18:08:25 · 2825 阅读 · 1 评论 -
完美洗牌算法(1)
题目描述; 有一个长度为2n的数组{a1,a2,a3,...,an,b1,b2,...,bn},希望排序后变成{a1,b1,a2,b2,...an,bn}.解法1:位置置换算法设定数组下标从1开始 原始序列 A1原创 2017-08-06 18:07:46 · 955 阅读 · 0 评论 -
投硬币问题
想兑换100元零钱,有1元,2元,5元,10元四种面值,总共有多少种兑换方法目前只想到穷举法: 点击(此处)折叠或打开 #includestdio.h> #includestdlib.h> int kindofMoney( )原创 2017-08-06 18:07:31 · 489 阅读 · 0 评论 -
寻找树中和为定值的所有路径
2016.8.18改You are given a binary tree in which each node contains a value. Design an algorithm to print all paths which sum up to that value. Note that it can be any path in the tree-it does not hav原创 2017-08-06 18:06:52 · 720 阅读 · 0 评论 -
LINUX C中用define定义可变参数的宏
一般在调试打印Debug信息的时候, 需要可变参数的宏. 从C99开始可以使编译器标准支持可变参数宏(variadic macros), 另外GCC也支持可变参数宏, 但是两种在细节上可能存在区别.1. __VA_ARGS__ __VA_ARGS__ 将 "..." 传递给宏 . 如 #define debug(format, ...) fprintf(stderr,原创 2017-08-06 18:11:56 · 814 阅读 · 1 评论 -
几种所谓的“高级IO接口”,其中你知道几个
以前,只是的确听说过有“高级IO“,也确实见过、用过,但一直以来真的没注意到”为什么那些接口是高级的?“ 昨儿算是弄明白了,就是大家常说的“零拷贝”,不需要数据在应用空间与内核空间之间来回复制!通过图来对比一下看:普通IO高级IO几种高级IO第一个:void* mmap(void* start,size_t length,int prot,int flags原创 2017-08-06 18:12:55 · 2414 阅读 · 0 评论