随笔分类 -  c/c++

signal.h中的宏定义SIG_DFL及SIG_IGN
摘要:SIG_DFL,SIG_IGN 分别表示无返回值的函数指针,指针值分别是0和1,这两个指针值逻辑上讲是实际程序中不可能出现的函数地址值。SIG_DFL:默认信号处理程序SIG_IGN:忽略信号的处理程序下面是一个指针值测试实例:#include #define SIG_DFL ((void(*)(int))0)#define SIG_IGN ((void(*)(int))1)int main() { int a = (int) SIG_DFL; int b = (int) SIG_IGN; printf("a = %d/n", a); //0 printf("b 阅读全文

posted @ 2014-02-19 10:40 屁屁侠 阅读(28942) 评论(0) 推荐(0) 编辑

#define SIG_DFL ((void(*)(int))0)
摘要:在linux内的信号处理函数中,有#define SIG_DFL ((void(*)(int))0)和#define SIG_IGN ((void(*)(int))1)两个宏定义。要理解这两个宏定义,我们先要知道signal函数的运行机制。首先我们看看该函数的原型声明,如下:void (*signal (int signr,void (*handler)(int))) (int)signal函数有两个参数,一个是指定需要捕获的信号signr;另外一个是新的信号处理函数指针void (*handler)(int)。注意,新的信号处理句柄或者说是新的信号处理函数是一个无返回值且具有一个整型参数的函 阅读全文

posted @ 2014-02-19 10:20 屁屁侠 阅读(2902) 评论(0) 推荐(1) 编辑

pthread之线程堆栈
摘要:转:http://blog.csdn.net/horstlinux/article/details/7666032//先来讲说线程内存相关的东西,主要有下面几条://进程中的所有的线程共享相同的地址空间。//任何声明为static/extern的变量或者堆变量可以被进程内所有的线程读写。//一个线程真正拥有的唯一私有储存是处理器寄存器。//线程栈可以通过暴露栈地址的方式与其它线程进行共享。// 有大数据量处理的应用中,有时我们有必要在栈空间分配一个大的内存块或者要分配很多小的内存块,但是线程的栈空间的最大值在线程创建的时候就已经定下来了,如果栈的大小超过个了个值,系统将访问未授权的内存... 阅读全文

posted @ 2014-02-18 18:39 屁屁侠 阅读(2493) 评论(0) 推荐(0) 编辑

strrchr()函数
摘要:函数简介函数名称: strrchr函数原型:char *strrchr(const char *str, char c);所属库: string.h函数功能:查找一个字符c在另一个字符串str中末次出现的位置(也就是从str的右侧开始查找字符c首次出现的位置),并返回从字符串中的这个位置起,一直到字符串结束的所有字符。如果未能找到指定字符,那么函数将返回NULL。相关函数:strchr例子1234567891011121314#include #include int main(void){char string[20];char *ptr, c = 'r';strcpy(st 阅读全文

posted @ 2014-02-17 18:33 屁屁侠 阅读(609) 评论(0) 推荐(0) 编辑

关于一点pthread_cond_t条件锁的思考以及实验
摘要:转:http://blog.csdn.net/aniao/article/details/5802015APUE上,关于条件锁。其中有这么几条总结:1.使用条件锁前必须先锁住对应的互斥锁。2.条件锁进入阻塞(pthread_cond_wait)时自动解开对应互斥锁,而一旦跳出阻塞立即再次取得互斥锁,而这两个操作都是原子操作。好,现在考虑到这一点,假如有如下函数:void* run(void *s){ pthread_mutex_lock(&mutex); while(i == 1) { printf("线程%u进入等待状态\n", (unsigned int)p.. 阅读全文

posted @ 2014-02-17 16:19 屁屁侠 阅读(5411) 评论(0) 推荐(2) 编辑

C++用new和不用new创建类对象区别
摘要:起初刚学C++时,很不习惯用new,后来看老外的程序,发 现几乎都是使用new,想一想区别也不是太大,但是在大一点的项目设计中,有时候不使用new的确会带来很多问题。当然这都是跟new的用法有关的。 new创建类对象,使用完后需使用delete删除,跟申请内存类似。所以,new有时候又不太适合,比如在频繁调用场合,使用局部new类对象就不是个 好选择,使用全局类对象或一个经过初始化的全局类指针似乎更加高效。一、new创建类对象与不new区别下面是自己总结的一些关于new创建类对象特点:new创建类对象需要指针接收,一处初始化,多处使用 new创建类对象使用完需delete销毁 new创建对象直 阅读全文

posted @ 2014-01-17 18:46 屁屁侠 阅读(1012) 评论(0) 推荐(0) 编辑

C++用new来创建对象和非new来创建对象的区别
摘要:转:http://www.cnblogs.com/GODYCA/archive/2013/01/10/2854777.html我们都知道C++中有三种创建对象的方法,如下:#include using namespace std;class A{private: int n;public: A(int m):n(m) { } ~A(){}};int main(){ A a(1); //栈中分配 A b = A(1); //栈中分配 A* c = new A(1); //堆中分配 delete c; return 0;}第一种和第二种... 阅读全文

posted @ 2014-01-17 18:39 屁屁侠 阅读(488) 评论(0) 推荐(0) 编辑

C++之创建对象时的new与不new
摘要:http://blog.csdn.net/cscmaker/article/details/7019977C++在创建对象的时候可以采用两种方式:(例如类名为Test) Test test 或者 Test* pTest = new Test()。 这两种方法都可以实例化一个对象,但是这两种方法有很大的区别,区别在于对象内容所在的内存空间不同,众所周知,内存的分配方式有三种 (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。 (2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函... 阅读全文

posted @ 2014-01-17 18:34 屁屁侠 阅读(559) 评论(0) 推荐(0) 编辑

#include
摘要:转:http://blog.csdn.net/loyal_baby/article/details/4073595最近在看题目中,发现有些代码中用的是#include但是又和我们平时编写c++代码不同,因为我们平时若像前面那样用,说明我们用的是标准c++库,但是后面要加上using namespace std。或者我们也可以用#include很多C++程序员还在使用而不是用更新的标准的库。 这两者都有什么不同呢?首先,5年前我们就开始反对把.h符号继续用在标准的头文件中。继续使用过时的规则可不是个好的方法。从功能性的角度来讲, 包含了一系列模板化的I/O类,相反地只仅仅是支持字符 流。另外,输 阅读全文

posted @ 2014-01-16 17:25 屁屁侠 阅读(393) 评论(0) 推荐(0) 编辑

signal函数的原型声明void (*signal(int signo, void (*fun(int))))(int)分析
摘要:转:http://blog.sina.com.cn/s/blog_4850a7880100hnam.htmlvoid (*signal(int signo, void (*fun(int))))(int)int (*p)();这是一个函数指针, p所指向的函数是一个不带任何参数, 并且返回值为int的一个函数.int (*fun())();这个式子与上面式子的区别在于用fun()代替了p,而fun()是一个函数,所以说就可以看成是fun()这个函数执行之后,它的返回值是一个函数指针,这个函数指针(其实就是上面的p)所指向的函数是一个不带任何参数,并且返回值为int的一个函数.所以说对于==== 阅读全文

posted @ 2013-12-12 11:16 屁屁侠 阅读(1053) 评论(0) 推荐(0) 编辑

关于fork()函数的精辟分析
摘要:http://blog.csdn.net/yanh_lzu/article/details/2311644第一贴:cu上关于fork()函数的精辟分析声明:在别人的博客上看到这篇文章,真的很精辟,把问题一下子讲清楚了。所以,特意转贴在此,向各位高人致敬,也向原贴主致谢!本人不改变原贴的风貌。查看原文作者:ccf发表于:2006-04-01 17:11:01#include ; #include ; main () { pid_t pid; pid=fork(); if (pid ;#include ;main (){ pid_t pid; printf("fork!"); 阅读全文

posted @ 2013-12-05 19:18 屁屁侠 阅读(503) 评论(0) 推荐(0) 编辑

va_start、va_end、va_list的使用
摘要:http://www.cnblogs.com/rainduck/archive/2010/11/10/1873417.html1:当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表void foo(...);void foo(parm_list,...);2:函数参数的传递原理函数参数是以数据结构:栈的形式存取,从右至左入栈.#include void fun(int a, ...){ int *temp = &a; temp++; for (int i = 0; i #include #include int demo(char*, ...);int main... 阅读全文

posted @ 2013-11-26 16:55 屁屁侠 阅读(367) 评论(0) 推荐(0) 编辑

堆和栈的区别
摘要:一、预备知识 程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 : 1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。 其操作方式类似于数据结构中的栈。 2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回 收 。 注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的。 初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另 一块区域。 程序结束后由系统释放。 4、文字常量区 :常量字... 阅读全文

posted @ 2013-09-27 18:21 屁屁侠 阅读(528) 评论(0) 推荐(0) 编辑

c语言中struct的内存对齐
摘要:为了让CPU能够更舒服地访问到变量,struct中的各成员变量的存储地址有一套对齐的机制。这个机制概括起来有两点:第一,每个成员变量的首地址,必须是它的类型的对齐值的整数倍,如果不满足,它与前一个成员变量之间要填充(padding)一些无意义的字节来满足;第二,整个struct的大小,必须是该struct中所有成员的类型中对齐值最大者的整数倍,如果不满足,在最后一个成员后面填充。各种类型的变量的align值如下,参考的是wikipedia的页面:--------------------------------------------------------------------------- 阅读全文

posted @ 2013-09-27 14:12 屁屁侠 阅读(2472) 评论(0) 推荐(0) 编辑

内存对齐与ANSI C中struct型数据的内存布局
摘要:当在C中定义了一个结构类型时,它的大小是否等于各字段(field)大小之和?编译器将如何在内存中放置这些字段?ANSI C对结构体的内存布局有什么要求?而我们的程序又能否依赖这种布局?这些问题或许对不少朋友来说还有点模糊,那么本文就试着探究它们背后的秘密。 首先,至少有一点可以肯定,那就是ANSI C保证结构体中各字段在内存中出现的位置是随它们的声明顺序依次递增的,并且第一个字段的首地址等于整个结构体实例的首地址。比如有这样一个结构体: struct vector{int x,y,z;} s; int *p,*q,*r; struct vector *ps; p = &s.x; q = 阅读全文

posted @ 2013-09-27 13:39 屁屁侠 阅读(258) 评论(0) 推荐(0) 编辑

glibc中malloc()的空间overhead
摘要:在linux下调用malloc()分配内存的时候,实际占用的内存与请求的内存尺寸的关系是什么呢,这个需要研究一下glibc中malloc()的实现。现在常见linux发行版中带的glibc中采用的都是Doug Lea的实现,下面的分析取自他的2.8.4版本的malloc.c。glibc对内存的管理是以chunk为单位的,未分配的chunk之间用双向链表连接成一个环,遍历的时候用指针遍历,已分配的chunk在其首部有chunk的大小,并以此字节数做遍历。每个chunk的首部要放置一个叫做malloc_chunk的struct,故每个chunk的大小至少是这个struct的大小,如果分配的空间或者 阅读全文

posted @ 2013-09-26 18:47 屁屁侠 阅读(1120) 评论(0) 推荐(0) 编辑

用GDB调试程序
摘要:转:http://blog.csdn.net/haoel/article/details/2879用GDB调试程序GDB概述————GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。一般来说,GDB主要帮忙你完成下面四个方面的功能: 1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。 2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式) 阅读全文

posted @ 2013-03-29 14:30 屁屁侠 阅读(241) 评论(0) 推荐(0) 编辑

c primer plus----第11章 字符串和字符串函数(一)
摘要:11.1.1 在程序中定义字符串 1.使用字符串常量 2.char数组 3.char指针 4.字符串数组//11.1//字符串是以空字符串\0结尾的char数组//gets() puts()的使用#include #define MSG "You must have many talents.Tell me some."#define LIM 5#define LINELEN 81int main(void){ char name[LINELEN]; char talents[LINELEN]; int i; //定义字符串的5种方法 //#define MSG ... 阅读全文

posted @ 2013-03-13 13:35 屁屁侠 编辑

c primer plus----第15章 位操作
摘要:#include #define YES 1#define NO 0#define SOLID 0#define DOTTED 1 //有点的#define DASHED 2 //虚线#define BULE 4#define GREEN 2#define RED 1#define BLACK 0#define YELLOW (RED | GREEN)#define MAGENTA (RED | BULE)#define CYAN (GREEN | BLUE)#define WHITE (RED | GREEN | BULE)#define OPAQUE 0x1#define... 阅读全文

posted @ 2013-03-08 13:54 屁屁侠 编辑

关于二进制补码
摘要:转:http://www.ruanyifeng.com/blog/2009/08/twos_complement.html负数在计算机中如何表示?举例来说,+8在计算机中表示为二进制的1000,那么-8怎么表示呢?很容易想到,可以将一个二进制位(bit)专门规定为符号位,它等于0时就表示正数,等于1时就表示负数。比如,在8位机中,规定每个字节的最高位为符号位。那么,+8就是00001000,而-8则是10001000。但是,随便找一本《计算机原理》,都会告诉你,实际上,计算机内部采用补码(Two's Complement)表示负数。什么是补码?它是一种数值的转换方法,要分二步完成:第一 阅读全文

posted @ 2013-02-19 17:37 屁屁侠 阅读(322) 评论(0) 推荐(0) 编辑

导航