代码改变世界

随笔分类 -  高级C

glibc的malloc钩子

2018-11-19 14:22 by 放作夥, 1389 阅读, 收藏,
摘要: 调试C程序内存泄露,在腾讯游戏的分享中也是用的这个方法 __malloc_hook(3) Linux man page Name __malloc_hook, __malloc_initialize_hook, __memalign_hook, __free_hook, __realloc_hook 阅读全文

[转] 微信协程库libco研究:hook系统函数

2017-12-27 09:16 by 放作夥, 904 阅读, 收藏,
摘要: 系统为我们提供了 dlopen,dlsym工具,用于运行时加载动态库。可执行文件在运行时可以加载不同的动态库,这就为hook系统函数提供了基础。 下面用一个小小的例子来说明如何利用dlsym工具hook系统函数。 假设现在我们需要统计程序中malloc的调用次数,但是不能修改原有程序。最简单的思路类 阅读全文

(转)GCC/G++编译器和VS IDE中的一些预定义宏和用户自定义宏

2014-08-02 12:38 by 放作夥, 721 阅读, 收藏,
摘要: 预定义宏编译器通常会根据平台和编译选项的不同,为被编译的程序提供不同的预定义的宏,例如WIN32 WIN64 LINUX, 例如DEBUG, RELEASE.1. 在使用gcc/g++编译器时,可以通过以下命令打印出编译器预编译的宏。gcc -dM -E - < /dev/null2. 在VS ID... 阅读全文

高级声明------定义一个函数指针数组指针

2014-02-14 21:55 by 放作夥, 395 阅读, 收藏,
摘要: #include #include char* fun1(char* p){printf("%s\n",p);return p;}char* fun2(char* p){printf("%s\n",p);return p;}int main(){char* (*a[3])(char* p);//定义函数指针数组char* (*(*pf)[3])(char* p);//定义函数指针数组指针,其实没什么大用,只是以防变态的面试题pf=&a;a[0]=fun1;a[1]=fun2;pf[0][0]("fun1");pf[0][1]( 阅读全文

C错题集锦

2014-02-14 21:42 by 放作夥, 201 阅读, 收藏,
摘要: 1.野指针#includestructstudent{char* name;//分配结构体内存时name未初始化,极易出错int score;}stu,*pstu;int main(){pstu=(struct student*)malloc(sizeof(struct student));//隐含name野指针strcpy(stu.name,"Jimy");//野指针,出错stu.score=99;return0;}2.按值传递#include#includevoid GetMemory(char*p,int num){//实际上只是让指针副本_str指向一块堆内存,正确 阅读全文

C中改变指针的指向

2014-01-15 21:19 by 放作夥, 918 阅读, 收藏,
摘要: 交换两个指针的指向若用函数调用来实现的话必须用到二级指针,因为参数传递是值传递,相当于只把两个指针副本的指向交换了一下,而c++中有引用,相当于按址传递,比c方便.若不用函数的话一级指针也可以.1、一级指针#include int main(){int a,b;int *p1=&a,*p2=&b;printf("%p\t%p\n",p1,p2);int *tmp;tmp=p1;p1=p2;p2=tmp;printf("%p\t%p\n",p1,p2);return 0;}2、二级指针#include void swap(int**x,in 阅读全文

define的高级用法

2013-12-04 20:16 by 放作夥, 2131 阅读, 收藏,
摘要: #的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。比如下面代码中的宏:#define WARN_IF(EXP)\do{ if (EXP)\fprintf(stderr, "Warning: " #EXP "\n"); }\while(0)那么实际使用中会出现下面所示的替换过程:WARN_IF (divider == 0);被替换为do {if (divider == 0)fprintf(stderr, "Warning" "divid 阅读全文

c实参传递给形参

2013-09-28 19:21 by 放作夥, 791 阅读, 收藏,
摘要: viod GetMemory(char*p,int num){ p=(char*)malloc(sizeof(char)*num);}voidTest(void){ char*str=NULL; GetMemory(str,100);//str仍为NULL strcpy(str,"hello");//运行出错}无论函数参数是什么类型,都是按照传递一份拷贝进去的,就算是指针也是一样。本例中,GetMemory(str,100)这句话,实际上传递的也是str指针的值null进去。所以其实GetMemory(char *p, int num)中的p指针实际上是一个临时变量(一个在 阅读全文

extern关键字

2013-07-10 12:07 by 放作夥, 790 阅读, 收藏,
摘要: extern本意是表示函数或者变量在别处定义。被extern修饰的全局变量不被分配空间,而是在连接的时候到别的文件中通过查找索引定位该全局变量的地址。变量默认是stastic内部链接,函数默认是外部链接extern,若函数定义在调用之前,可以通过;但是如果函数定义在调用之后的话就的加extern来声明,不然会警告调用没有原型。1.用extern来声明全局变量1)如果外部变量不在文件的开头定义,其有效的作用范围只限于定义处到文件终,表示该变量是一个将在下面定义的全局变量#include using namespace std; int max(int,int); //函数声明 void mai. 阅读全文