C语言进阶
文章平均质量分 76
造夢先森
一定要努力努力,永不放弃,才可以改变世界,改变自己~
展开
-
Linux函数调用劫持方法
Ring3函数调用劫持:基于环境变量LD_PRELOAD的动态库劫持 在Linux中,动态库加载的时候,会按照以下顺序进行搜索:LD_PRELOAD >LD_LIBRARY_PATH >/etc/ld.so.cache>/lib>/usr/lib方法原理:通过LD_PERELOAD设置编写自己的so库函数在原正常函数前执行例子:劫持fputs()函数:#include<stdio.h>#include<dlfcn.h> //用于搜索原函数/*原创 2022-05-18 10:59:41 · 557 阅读 · 0 评论 -
【Leetcode】算法与数据结构 C语言
注:Java中 String常用函数:String str:str.length() //得到字符串长度str.charAt(i) //得到指定位置字符str.charAt(i)-'0' //将某个字符转换为int型char[] cs = str.toCharArray(); //将字符串转换为数组一,转换题型String to Integer (atoi)【题目】Implemen原创 2015-11-27 21:47:47 · 835 阅读 · 0 评论 -
性能调优 -- 语言篇(C)
switch-case和if-else的效率比较https://blog.csdn.net/wyk19950704/article/details/50983903在for循环体内定义变量的效率分析https://www.cnblogs.com/avin/p/7458063.html原创 2021-07-01 20:09:59 · 308 阅读 · 0 评论 -
内存错误检测工具-AddressSanitizer(ASAN)
ASAN(Address-Sanitizier)早先是LLVM中的特性,后被加入GCC 4.8,在GCC 4.9后加入对ARM平台的支持。因此GCC 4.8以上版本使用ASAN时不需要安装第三方库,通过在编译时指定编译CFLAGS即可打开开关。之前介绍过一款传统的内存问题检测工具Valgrind :https://blog.csdn.net/qq_15437629/article/details/79264600用过 Valgrind 的朋友应该都清楚,其会极大的降低程序运行速度,大约降低10倍,而原创 2021-03-06 14:39:51 · 15882 阅读 · 4 评论 -
rpc socket动态库应用实践
功能:提供一个socket的动态库,epoll接收消息;提供rpc_request()函数发送requset字符串,并接收reply消息;提供func_register()注册需要socket server reply的消息rpc_socket.h#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <string.h>#include <sys/types.原创 2020-10-06 17:21:32 · 228 阅读 · 0 评论 -
c链表、cmap、hashmap
#include <stdio.h>#include <stdlib.h>typedef int DataType; //用DataType 替代 int方便修改数据类型typedef struct Node{ DataType data; //数据域 struct Node *next; //指针域}Node;//链表初始化, 创建空链表Node *InitList(){ Node *head原创 2020-08-22 23:57:31 · 481 阅读 · 0 评论 -
C语言--使用dlopen、dlsym、dlclose运行时装载动态库
一个可执行程序可能与多个动态库有关联,通常是在程序运行时将必要的动态库装载入进程实体(内存中);另外一种,则是使用dlopen/dlsym/dlclose来动态地将动态库装载到当前进程实体中.简单点说,就是:1.dlopen将指定的动态库以特定的方式装载到当前进程实体,并返回一个可操作的句柄,用以后续获取函数地址等操作;2.dlsym从指定的(由dlopen的返回值指定)库中获得指...原创 2018-08-21 21:32:29 · 2843 阅读 · 0 评论 -
make、Makefile &静态库、动态库
场景说明: 文件如下,假设max.c和min.c是两个人分别设计实现的接口函数,当我们要使用其功能时,并不在意其实现细节。因此我们只要按照头文件max.h、min.h中的接口声明来调用函数功能即可。max.cint max(int a, int b){ if(a>b){ return a; }else{..................原创 2017-08-20 20:42:18 · 7212 阅读 · 1 评论 -
automake编写完整的项目---静态库+可执行文件+rpm包
目录结构: |- sample |- src : 存放源代码文件 main.c |- lib : 存放生成库文件 hello.c |- include: 存放库中头文件 hello.hmain.c:#include "hello.h"int main(){ char* s = "Mr.Sandman"; hello(s); re......原创 2017-08-25 22:41:54 · 3546 阅读 · 0 评论 -
C语言--结构体回调函数示例
#include &amp;amp;amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;amp;amp;gt; struct component_provider { int component_id; const char *component_name;};static const struct component_provider components[] = { {原创 2018-09-19 23:11:36 · 3371 阅读 · 1 评论 -
C语言--文件操作
文件的打开操作 fopen 打开一个文件 文件的关闭操作 fclose 关闭一个文件 文件的读写操作 fgetc 从文件中读取一个字符 fputc 写一个字符到文件中去 fgets 从文件中读取一个字符串 fputs 写一个字符串到文件中去 fprin...原创 2018-10-01 13:41:16 · 316 阅读 · 0 评论 -
Makefile选项CFLAGS,LDFLAGS,LIBS
我们用gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,例:gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld上面这句表示在编译hello.c时:-I /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件...原创 2019-01-04 23:28:21 · 8502 阅读 · 0 评论 -
C语言指针
int p; //这是一个普通的整型变量 int *p; //首先从P 处开始,先与*结合,所以说明P 是一个指针,然后再与int 结合,说明指针所指向的内容的类型为int 型.所以P是一个返回整型数据的指针 int p[3]; //首先从P 处开始,先与[]结合,说明P 是一个数组,然后与int 结合,说明数组里的元素是整型的,所以P 是一个由整型数据组成的数组 int *p[3];...原创 2018-08-19 13:43:23 · 208 阅读 · 0 评论 -
c语言str系列函数
#include&lt;stdio.h&gt;#include&lt;stdlib.h&gt;#include&lt;string.h&gt;int main(){ char *str1; char *str2 = "Hello"; char *str3 = "World"; /* 1,s原创 2018-08-19 13:36:54 · 2499 阅读 · 0 评论 -
C语言--socket、epoll
分为服务器端和客户端,服务器端监听端口发来的请求,收到后向客户端发送一个Hello World,客户机负责发送消息并打印收到的Hello World.服务器步骤:建立socket,绑定socket和地址信息,开启监听,收到请求后发送数据。客户端步骤:建立socket,连接服务器端,接收并打印服务器给的数据服务器:#include<stdio.h>#include<..................原创 2018-06-17 22:30:40 · 2687 阅读 · 0 评论 -
Valgrind使用说明
Valgrind是运行在Linux上一套基于仿真技术的程序调试和分析工具,是公认的最接近Purify的产品,它包含一个内核——一个软件合成的CPU,和一系列的小工具,每个工具都可以完成一项任务——调试,分析,或测试等。Valgrind可以检测内存泄漏和内存越界,还可以分析cache的使用等,灵活轻巧而又强大。 一 Valgrind概观Valgrind的最新版是3.2.3,该版本包...原创 2018-02-05 21:19:39 · 943 阅读 · 0 评论 -
C语言--防坑指南
6,__attribute__属性我们在进行定义数据结构计算数据结构大小的时候,或者进行网络通讯的socket发送数据的时候,都会遇到一个共同的问题:数据对齐问题。这个问题是硬件为提高访问数据的效率引出的问题。程序编译器对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也可以屏蔽掉变量默认的对齐方式,自己设定变量的对齐方式。下面就简单的介绍常见的3种方法:..................原创 2018-01-19 23:50:55 · 349 阅读 · 0 评论 -
C语言--位运算
#include <stdio.h>int main(){ int a = 4; //00000000 00000000 00000000 00000100 int b = 7; //00000000 00000000 00000000 00000111 // "&"用途 printf("%d\n", a&...原创 2017-09-09 20:51:57 · 280 阅读 · 0 评论 -
C语言--struct和union
结构体#include <stdio.h>struct weapon{ char name[6]; int atk; int price;} ; int main(){ struct weapon weapon_1 = {"AK47",100,200}; printf("%s\n",weapon_1.name); // AK4...原创 2017-09-09 19:55:29 · 882 阅读 · 0 评论 -
C语言--链表与CMap
静态链表#include <stdio.h>struct stu{ long num; float score; struct stu *next; };int main(){ struct stu a,b,c,*head; a.num = 1; a.score = 88.5; b.num = 2; ...原创 2017-09-06 21:21:12 · 750 阅读 · 0 评论 -
C语言--Linux多线程pthread
简介pthread是POSIX thread的 简称,Posix线程是一个POSIX标准线程.该标准定义内部API创建和操纵线程.线程库实行了POSIX线程标准通常称为pthreads.pthreads是最常用的POSIX系统如Linux和Unix,而微软Windowsimplementations同时存在.举例来说,pthreads-w32可支持MIDP的pthread Pthr...原创 2017-08-20 16:13:53 · 11180 阅读 · 2 评论 -
C语言--字符串基本操作
字符串基本操作#include <stdio.h>//指针操作 void StatString1(char *pInputString, int *pDigitNum){ *pDigitNum = 0; printf("%s\n",pInputString); while(*pInputString!='\0'){ // for(;*pInp...原创 2017-08-12 23:00:16 · 2722 阅读 · 0 评论 -
C语言低级错误案例
一,修改函数形参分析:在函数内部不能改变指针指向的地址,。当TrunkHBDeactive函数调用SetTimeHandle函数获取指针的时候,实际上pTime的值根本没有改变,始终为一个空指针。注:对函数参数所在的存储单元的直接修改不会作用在函数之外,但是对参数存储单元中存放的地址指向的存储单元的修改,则会在函数之外起作用。总结:函数内部不能修改指针指向的地址 TimerHand...原创 2017-02-06 15:12:01 · 1275 阅读 · 0 评论 -
C语言--内存操作与管理
1、什么是内存?(硬件和逻辑两个角度)从硬件角度:内存实际上是电脑的一个配件(一般叫内存条)。根据不同的硬件实现原理还可以把内存分成SRAM和DRAM(DRAM又有好多代,譬如最早的SDRAM,后来的DDR1、DDR2……、LPDDR)从逻辑角度:内存是这样一种东西,它可以随机访问(随机访问的意思是只要给一个地址,就可以访问这个内存地址)、并且可以读写(当然了逻辑上也可以限制其为只读或者只...原创 2017-08-19 20:02:28 · 2940 阅读 · 2 评论 -
C语言--回调函数
使用场景回调函数比喻: 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。回调函数是一个程序员不能显式调用的函...原创 2017-08-19 14:53:21 · 632 阅读 · 0 评论 -
C语言--修改字符串方式
1,数组拷贝#include<stdio.h>#include<string.h>#define MAX 32enum{ STR1, STR2, STR_MAX,};static const char *arr[] = { "Jack", "Lucy"};int change_string(char *old_str, cha...原创 2018-03-22 23:18:39 · 3847 阅读 · 0 评论 -
hash表的实现和hash桶的示例(c实现)
hash是以空间换时间的结构,现在空间越来越大,而且对性能要求越来越高的年代,这绝对是值得的。hash含义就是散列,就是把我们本来想查找的一大群结构体数据分散开,更容易查找。一个好的hash函数应该做到对所有元素平均分散排列,尽量避免或者降低他们之间的冲突(Collision)。hash函数的选择必须慎重,如果不幸所有的元素之间都产生了冲突,那么hash表将退化为链表,其性能会大打折扣,时间...原创 2018-02-06 23:22:37 · 3894 阅读 · 0 评论