
C语言编程
文章平均质量分 59
alexander1125
这个作者很懒,什么都没留下…
展开
-
浅谈多线程编程
为啥要搞多线程?因为多进程太耗费资源!一个进程包含(数据区,代码区,堆栈区)。而一个线程只有(堆栈区)。 为啥要“多”xx程序设计!想想看,你用浏览器打开某一个网站的网页,可以这个网站的服务器坏了。如果你的浏览器是单线程的,你就得一直等待这个链接connect返回失败才能继续连接别的网页或者干其他的事情。 所以你可以为每一个连接创建一个线程,就算是打不开网页,你的主线程(WIN下面好原创 2009-06-23 18:49:00 · 992 阅读 · 0 评论 -
C语言文件指针与文件描述符之间可以相互转换
C语言文件指针与文件描述符之间可以相互转换:这要通过fdopen和fileno两个函数实现。它们都包含在头文件stdio.h中。fdopen的原型: FILE * fdopen(int filedes, const char *opentype);第一个参数filedes是一个打开的文件描述符,opentype是表示打开方式的字符串,和fopen函数转载 2016-06-29 10:45:07 · 1355 阅读 · 0 评论 -
c语言中的const的用法
1)、const在前面 const int nValue; //nValue是const const char *pContent; //*pContent是const, pContent可变 const (char *) pContent;//pContent是const,*pContent可变 char* const pContent; //pContent是const转载 2016-04-03 20:00:55 · 461 阅读 · 0 评论 -
linux container_of 的用法
<br />Linux常用container_of宏从成员变量提取整个结构体的首地针,这个宏的定义如下:<br /><br />#define container_of(ptr, type, member) ({ /<br />const typeof( ((type *)0)->member ) *__mptr = (ptr); /<br />(type *)( (char *)__mptr - offsetof(type,member) );})<br /><br />typeof是gcc的一个扩展,用原创 2010-09-09 21:59:00 · 1335 阅读 · 0 评论 -
BIT内存顺序
机器的最小寻址单位是字节,bit无法寻址,也就没有高低地址和起始地址的概念,我们需要定义一下bit的“地址”。以一个字节为例,我们把从左到右的8个bit的位置(position)命名按顺序命名如下:p7 p6 p5 p4 p3 p2 p1 p0其中最左端的p7为起始地址。这样以一字节大小的数值10110101(b)为例,其在不同平台下的内存位序如下:大端的含义是数值的最高位转载 2015-10-13 15:06:42 · 3890 阅读 · 0 评论 -
字符串操作函数
strncpy()函数原型:extern char *strncpy(char *dest, char *src, int n); 用法:#include 功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。 说明:如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。 如果src的长度小于n个字节,转载 2014-09-01 12:21:22 · 735 阅读 · 0 评论 -
C语言结构体对齐问题详解
C语言结构体对齐问题详解测试环境32位机 WinXP:编译器VC6(MS cl.exe ) 和 mingw32-gcc-4.5.2 1 结构体数据对齐(没有#pragma pack()宏定义)结构体对齐可以总结为三个基本原则①数据成员对齐规则:结构体的数据成员中,第一个成员从offset为0的地址开始,以后每一个成员存储的起始位置为该成员大小转载 2013-09-15 16:16:07 · 1076 阅读 · 0 评论 -
C语言宏定义之条件编译
4、条件编译命令 有几个命令可对程序源代码的各部分有选择地进行编译,该过程称为条件编译。商业软件公司广泛应用条件编译来提供和维护某一程序的许多顾客版本。 #if、#else,#elif及#endif #if的一般含义是如果#if后面的常量表达式为true,则编译它与#endif之间的代码,否则跳过这些代码。命令#endif标识一个#if块的 结束。 #if转载 2011-12-18 20:43:48 · 3916 阅读 · 0 评论 -
C语言连接符号##和#解析
宏定义中的## 连接符与# 符## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释,但不知道也无所谓。同时值得注意的是#符是把传递过来的参数当成字符串进行替代。下面来看看它们是怎样工作的。这是MSDN上的一转载 2011-12-07 23:26:29 · 6693 阅读 · 0 评论 -
c语言-数组/指针/函数(小结)
<br />int f() f是一個函數,返回一個整型值 <br />int *f() f是一個函數,返回一個整型指針 <br />int (*f)() f是一個函數指針,所指向的函數返回一個整型值 <br />int *(*f)() f是一個函數指針,所指向的函數返回一個整型指針 <br />int f[] f是一原创 2011-04-13 19:24:00 · 1133 阅读 · 0 评论 -
最近的BUGS
char分三种:signed char 这个才是-128 到127unsigned char 这个是0 到 255char 这个可能和signed char 一致,也可能和unsigned char 一致,是由编译器来决定的,所以char的取值范围在不同的编译器上可能是不同的。而最近用的keil char默认是unsigned char。NND,搞出了大的BUG。原创 2011-04-05 20:44:00 · 1215 阅读 · 0 评论 -
C语言函数参数传递之痛
首先先讲一下表达式中“类型提升”,来自《C专家编程》 整型提升就是char,short(无论unsigned,signed),位段类型,枚举类型都将提升为int类型。前提是int类型能完整容纳原先的数据,否则提升为unsigned int类型。 char c1,c2; c1=c1+c2; 在运算时,c1和c2都先被提升为int类型进行运算,运算结果再裁减为char类型。 类似的 float f1,f2; f1=f1*f2; 在运算时,f1和f2都先提升为dou原创 2011-05-11 20:41:00 · 2911 阅读 · 0 评论 -
C函数参数类型提升
曾看到printf的一道题,挺有意思,记录一下。float value = 1.0;printf("value_int = %d/n", value);printf("value_float = %f/n", value);应该输出什么?乍看这个题,很简单,浮点数1.0在内存中的存储形式是0x3f800000。float型在内存中占4Byte, int型也占4字节,按说就直接输出0x3f800000的十进制形式就可以呗。谁知道一运行大跌眼镜,打印信息:value_int = 0value_float = 1转载 2011-05-11 18:22:00 · 2473 阅读 · 2 评论 -
宏定义中do{}while(0) 的作用
1,空的宏定义避免warning:#define foo() do{}while(0)2,存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现。3,如果出现在判断语句过后的宏,这样可以保证作为一个整体来是实现:#define foo(x) /action1(); /action2();在以下情况下:if(NULL == pPointer) foo();就会出现action1和action2不会同时被执行的情况,而这显然不是程序设计的目的。原创 2011-03-12 11:01:00 · 1260 阅读 · 0 评论 -
INTEL汇编的函数调用过程
<br />汇编调用函数的过程<br /> <br /> push arg2 func: push %ebp 保存caller的栈顶<br /> push arg1 mov %esp,%ebp ebp保存callee的新栈顶<br /> p原创 2010-10-30 11:15:00 · 1551 阅读 · 0 评论 -
关于程序数组编译
int a=6;int arr[a]; //不能通过编译//***********************************//***********************************void function(){ int a=6; int arr[a]; //可以通过编译}原创 2010-10-25 22:48:00 · 1011 阅读 · 0 评论 -
C语言小结
把null结尾的字符串转换成整数 #include int atoi(const char *nptr); long atol(const char *nptr); long long atoll(const char *nptr);原创 2010-09-17 08:47:00 · 920 阅读 · 0 评论 -
深入解析C语言变长参数列表
<br />1:当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表<br />void foo(...);<br />void foo(parm_list,...);<br />2:函数参数的传递原理<br />函数参数是以数据结构:栈的形式存取,从右至左入栈.eg:<br />#include <iostream> <br />void fun(int a, ...) <br />{ <br />int *temp = &a; <br />temp++; <br />for (int i =原创 2010-09-09 22:26:00 · 1690 阅读 · 0 评论 -
scanf正则表达式
怎样从中取出tom?char * url="";char uri[10]={0};sscanf(url,"%*[^:]:%[^@]",uri);转贴:在softmse (Jake) 的问题贴http://community.youkuaiyun.com/Expert/topic/4843/4843294.xml?temp=. 4321558中 ,周星星给出了一个很cool的sscanf转载 2016-07-03 11:03:23 · 1694 阅读 · 0 评论