C语言编程基础概要课件.ppt

上传人(卖家):晟晟文业 文档编号:4372180 上传时间:2022-12-03 格式:PPT 页数:86 大小:787.50KB
下载 相关 举报
C语言编程基础概要课件.ppt_第1页
第1页 / 共86页
C语言编程基础概要课件.ppt_第2页
第2页 / 共86页
C语言编程基础概要课件.ppt_第3页
第3页 / 共86页
C语言编程基础概要课件.ppt_第4页
第4页 / 共86页
C语言编程基础概要课件.ppt_第5页
第5页 / 共86页
点击查看更多>>
资源描述

1、HUAWEI TECHNOLOGIES CO.,LTDHuawei Confidential Security Level:华为技术有限公司华为技术有限公司C C语言编程基础语言编程基础内部公开HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.返回值7.强制类型转换8.Switch case9.字符串10.溢出11.资源释放12.If规范13.临界资源保护14.简单既是美HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 前言提高我司产品竞

2、争力,研发要在以下几个方面下提高我司产品竞争力,研发要在以下几个方面下功夫功夫:p提高规划水平,把握正确的方向(战略)p提高设计水平,搭建合理的系统(战术)p提高编码水平,开发稳定的代码(单兵作战技能)HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 前言l我们为什么要进行培训?我们为什么要进行培训?最好的医术是预防真正的难问题往往是低级错误引起的我们的编码水平不容乐观C是程序员的语言HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 前言l要提高编码水平,每个开发人员要要提高编码水平,每个开发人员要做到

3、做到:勤学苦练,提高编程技能前车之鉴,后世之师,不犯同样的错误;坚持代码Review、PC-LINT检查和单元测试;l总而言之,就是少犯错误,尽早发现错误总而言之,就是少犯错误,尽早发现错误HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.返回值7.强制类型转换8.Switch case9.字符串10.溢出11.资源释放12.If规范13.临界资源保护14.简单既是美HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之简单就是美If

4、(a&b|c|d=e&f)If(a&b|c|d=e&f)这个表达式的正确运算顺序是什么?这个表达式的正确运算顺序是什么?test(a+,+a,a+,+a,a+,+a)test(a+,+a,a+,+a,a+,+a)a=1;a=1;实际函数调用时,传入的参数值分别是多少?实际函数调用时,传入的参数值分别是多少?(+(+*p+)(-p+)(-*q-)q-)语义是什么?语义是什么?a=b=1,c=2,d=3;e=4;a=b=1,c=2,d=3;e=4;a a的值是多少?的值是多少?HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之简单就是美这里没有

5、答案,只有问题:我们问什么要写这样的代码?工作太轻松?BUG不够多?水平显不出?如何改进?优先级搞不清楚用括号;复合语句太罗嗦,拆成几行来写;套用两句广告词:把简单的事情复杂化,太累把复杂的事情简单化,贡献!HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之简单就是美编码的三不原则不要挑战自己的记性不要挑战同事的耐心不要挑战编译器的水平编码的三用原则能用简单语句的,就不要用复杂的技巧能用成熟代码的,就不要再来一套能用上工具的,就一定要机械化HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 我们要

6、求什么?struct XXXstruct XXX char cA;char cA;short sB;short sB;long lC;long lC;void main()void main()char char*pChar;pChar;pChar=(char pChar=(char*)malloc(7);)malloc(7);memcpy(pChar,abcdefgh,sizeof(XXX);memcpy(pChar,abcdefgh,sizeof(XXX);printf(%sn,pChar);printf(%sn,pChar);return;return;HUAWEI TECHNOLOGI

7、ES CO.,LTD.Huawei Confidential 我们要求什么?续struct XXXstruct XXX char cA;char cA;short sB;short sB;long lC;long lC;void main()void main()char char*pChar;pChar;pChar=(char pChar=(char*)malloc(7);)malloc(7);/*0,0,魔鬼数字魔鬼数字;1,;1,未申请成功怎么办?未申请成功怎么办?*/memcpy(pChar,“abcdefgh”,sizeof(XXX);memcpy(pChar,“abcdefgh”,

8、sizeof(XXX);/*2,2,内存越界内存越界*/printf(“%sn”,pChar);printf(“%sn”,pChar);/*3,3,没有字符串结束符没有字符串结束符*/return;return;/*4,4,没有释放内存没有释放内存*/HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.返回值7.强制类型转换8.Switch case9.字符串10.溢出11.资源释放12.If规范13.临界资源保护14.简单既是美HUAWEI TECHNOLOGIES CO.,LTD.

9、Huawei Confidential 基础篇之sizeof数据结构是数据结构是C语言的基础语言的基础C语言的灵活性很大程度上在于其数据结构的灵活性语言的灵活性很大程度上在于其数据结构的灵活性要用好数据结构,首先要掌握数据结构大小的计算要用好数据结构,首先要掌握数据结构大小的计算系统为每个数据结构、每个变量都会分配一个对应的存储空间,系统为每个数据结构、每个变量都会分配一个对应的存储空间,这个存储空间的大小就是数据结构的尺寸这个存储空间的大小就是数据结构的尺寸HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之sizeoftypedef un

10、ion record LONG lIndex;SHORT sLevel6;CHAR cPos;REC_S;REC_SstMax,*pMax;CHARstr=“Hello”;CHAR*pChar=str;ULONGulGrade=10;USHORTusClass 10;DOUBLEdWeightUCHAR*pCharArray1010;Sizeof(stMax/pMax/str/pChar/ulGrade/usClass/dWeight/pCharArray)的取值分的取值分别是多少?别是多少?HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇

11、之sizeoftypedef union record LONG lIndex;SHORT sLevel6;CHAR cPos;REC_S;REC_SstMax(12),*pMax(4);CHARstr=“Hello”(516,不要忘了,不要忘了0);CHAR*pChar=str(4);ULONGulGrade=10(4);USHORTusClass 10(2);DOUBLEdWeight(8);UCHAR*pCharArray1010(41010400);HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4

12、.字节序5.函数参数6.返回值7.强制类型转换8.Switch case9.字符串10.溢出11.资源释放12.If规范13.临界资源保护14.简单既是美HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之字节对齐随着半导体技术的发展,我们经历随着半导体技术的发展,我们经历8bit8bit、16bit16bit、32bit32bit乃至乃至64bit64bit的的CPUCPU,我们产品当前大多使用我们产品当前大多使用32bit CPU32bit CPU从内存存取效率来说,从内存存取效率来说,4 4字节对齐的存取速度是最快的,非对齐情况下,字节

13、对齐的存取速度是最快的,非对齐情况下,CPUCPU需要分解成两次需要分解成两次32bit32bit操作;操作;缺省情况下,编译器自动对数据结构进行四字节对齐,以提高程序执行缺省情况下,编译器自动对数据结构进行四字节对齐,以提高程序执行的效率,在特殊情况下,可以通过预编译指定指定数据结构为的效率,在特殊情况下,可以通过预编译指定指定数据结构为1 1字节对齐字节对齐或者其他;或者其他;对于对于Power PC/IntelPower PC/Intel系列系列CPUCPU,在非四字节对齐情况下,由,在非四字节对齐情况下,由CPUCPU自动完自动完成两次操作,对上层应用透明;对于成两次操作,对上层应用透

14、明;对于MIPS CPUMIPS CPU,则需要通过编译选项进,则需要通过编译选项进行干预,或者调整数据结果避免出现这种情况,否则会产生例外;行干预,或者调整数据结果避免出现这种情况,否则会产生例外;字节对齐对数据结构的尺寸(字节对齐对数据结构的尺寸(sizeofsizeof)直接产生影响)直接产生影响HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之字节对齐typedef struct Head CHAR src 6;ULONG ulType;HEAD_S;VOID Encapsulation(CHAR*pBuf)ULONG ulLen,

15、ulDestIP;CHAR*pData=pBuf;ulLen =sizeof(HEAD_S);pData+=ulLen;ulDestIP=VOS_NTOHL(IP_S*)pData-ulDestIP);return;HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之字节对齐#pragma pack(push)#pragma pack(1)typedef struct Head CHAR src 6;ULONG ulType;HEAD_S;#pragma pack(pop)VOID Encapsulation(CHAR*pBuf)ULONG

16、ulLen,ulDestIP;CHAR*pData=pBuf;ulLen =sizeof(HEAD_S);pData+=len;ulDestIP=VOS_NTOHL(IP_S*)pData-ulDestIP);(MIPS CPU 异常异常)return;HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之字节对齐数据结构内部对齐,下面数据结构内部对齐,下面2种定义哪个好?种定义哪个好?typedef struct example USHORT usA;ULONG ulA;USHORT usB;UCHAR ucA;USHORT usC;EXAM

17、PLE_SVStypedef struct example ULONG ulA;USHORT usA;USHORT usB;USHORT usC;UCHAR ucA;UCHAR ucReserved;EXAMPLE_S HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之字节对齐案例点评案例点评l在定义数据结构时(尤其是涉及协议和在定义数据结构时(尤其是涉及协议和IPC通讯的时候),没有特通讯的时候),没有特殊理由的话,都定义成四字节对齐;这样做可能浪费几个字节,殊理由的话,都定义成四字节对齐;这样做可能浪费几个字节,但是不会出问题;但是不会

18、出问题;l除了数据结构总长度是四字节对齐外,每一个部分也要保证它是除了数据结构总长度是四字节对齐外,每一个部分也要保证它是四字节对齐的(可以按照四字节、两字节、一字节的顺序排放数四字节对齐的(可以按照四字节、两字节、一字节的顺序排放数据结构中的各个域);据结构中的各个域);l对于无法定义成四字节对齐的数据结构,如以太网对于无法定义成四字节对齐的数据结构,如以太网II、HDLC等,等,则将它们强行定义成一字节对齐,以规避这个问题;则将它们强行定义成一字节对齐,以规避这个问题;l对于对于MIPS CPU,在必须面对非四字节对齐情况时,采用编译选项,在必须面对非四字节对齐情况时,采用编译选项方式加以

19、解决;方式加以解决;HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.返回值7.强制类型转换8.Switch case9.字符串10.溢出11.资源释放12.If规范13.临界资源保护14.简单既是美HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之字节序X86系统:系统:VOID QosConfigPolicy()ulDestIP=从命令行读取用户配置的参数;从命令行读取用户配置的参数;pQosPolicy-ulDestIP=u

20、lDestIP;return;主机处理:主机处理:VOID QosClassify()pIp=(IP_S*)pData;if(pIp-ulDestIp=pQosPolicy-ulDestIP)DoSomething();return;HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之字节序X86系统:系统:VOID QosConfigPolicy()ulDestIP=从命令行读取用户配置的参数;从命令行读取用户配置的参数;pQosPolicy-ulDestIP=ulDestIP;return;主机处理:主机处理:VOID QosClassi

21、fy()pIp=(IP_S*)pData;if(VOS_HTONL(pQosPolicy-ulDestIP)=pIp-ulDestIp)DoSomething();return;HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之字节序由于历史的原因,业界存在两种字节序标准:由于历史的原因,业界存在两种字节序标准:BigEndian和和LittleEndian,Power PC是大头,是大头,X86是小头,有些是小头,有些CPU可以通过寄存器设置支持不同的字节序,例如可以通过寄存器设置支持不同的字节序,例如MIPS;所谓大头就是高位在低字节,

22、低位在高字节;小头则与此相反,以所谓大头就是高位在低字节,低位在高字节;小头则与此相反,以0 x345678为例,为例,大头内存从低到高的存放次序为大头内存从低到高的存放次序为00,34,56,78,小头内存从低到高的存放次序为,小头内存从低到高的存放次序为78,56,34,00;(上面的数值统一为;(上面的数值统一为16进制表示形式)进制表示形式)字节序问题广泛存在于设备与设备之间、单板与单板之间、单板与底层芯片之间,字节序问题广泛存在于设备与设备之间、单板与单板之间、单板与底层芯片之间,只要两个处理单元的字节序不同,这个问题就存在,为了解决不同字节序的处理只要两个处理单元的字节序不同,这个

23、问题就存在,为了解决不同字节序的处理单元之间的通信问题,业界定义了主机序和网络序的概念,网络序主要用于信息单元之间的通信问题,业界定义了主机序和网络序的概念,网络序主要用于信息传递,一般不用于计算,其字节顺序与大头一致;传递,一般不用于计算,其字节顺序与大头一致;除了在编码时绷紧这根弦以外,我们在器件选择时尽量选择主机序与网络序一致除了在编码时绷紧这根弦以外,我们在器件选择时尽量选择主机序与网络序一致的芯片,同一设备的不同单板使用相同的字节序,并优先选择支持大头的芯片,的芯片,同一设备的不同单板使用相同的字节序,并优先选择支持大头的芯片,这样,即使不能彻底解决问题,也可以彻底规避问题。这样,即

24、使不能彻底解决问题,也可以彻底规避问题。HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.返回值7.强制类型转换8.Switch case9.字符串10.溢出11.资源释放12.If规范13.临界资源保护14.简单既是美HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之函数参数在在C语言中,函数通过返回值和参数与调用者交换信息,对参数理语言中,函数通过返回值和参数与调用者交换信息,对参数理解和使用的正确与否,直接影响到函数功能能否

25、正确实现;解和使用的正确与否,直接影响到函数功能能否正确实现;函数参数自身占用的存储单元在函数参数自身占用的存储单元在堆栈堆栈中分配,入口参数指向的数中分配,入口参数指向的数值或者地址在函数入口处拷贝到堆栈区中,因此对函数参数所在值或者地址在函数入口处拷贝到堆栈区中,因此对函数参数所在存储单元的直接修改不会作用到函数之外,而对参数存储单元中存储单元的直接修改不会作用到函数之外,而对参数存储单元中存放的地址指向的存储空间的修改,则会在函数之外其作用;存放的地址指向的存储空间的修改,则会在函数之外其作用;调用者在进行函数调用之前,必须事先申明被调用函数的原型,调用者在进行函数调用之前,必须事先申明

26、被调用函数的原型,包括返回值类型和参数类型;包括返回值类型和参数类型;HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之函数参数BOOL GetMemory(CHAR*p)/*申请内存申请内存*/p=(CHAR *)malloc(100);if(NULL=p)return FALSE;else return TRUE;VOID Test(void)CHAR*str=NULL;If(GetMemory(str)strcpy(str,hello world);printf(str);return;HUAWEI TECHNOLOGIES CO.,

27、LTD.Huawei Confidential 基础篇之函数参数CHAR*GetMemory(CHAR*p)/*申请内存申请内存*/*p=(CHAR *)malloc(100);return*p;VOID Test(void)CHAR*str=NULL;If(NULL!=GetMemory(&str)strcpy(str,hello world);printf(str);free(str);str=NULL;return;HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.返回值7.强

28、制类型转换8.Switch case9.字符串10.溢出11.资源释放12.If规范13.临界资源保护14.简单既是美HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之返回值在在C语言中,函数的调用者通过返回值了解函数的执行情况;语言中,函数的调用者通过返回值了解函数的执行情况;函数缺省的返回值类型为函数缺省的返回值类型为int,编程规范要求必须显示定义函数的,编程规范要求必须显示定义函数的返回类型;返回类型;对于反映了函数执行状态的返回值,调用者必须依据返回值进行对于反映了函数执行状态的返回值,调用者必须依据返回值进行相应的处理,尤其是对

29、于函数执行异常的情形;相应的处理,尤其是对于函数执行异常的情形;函数的出口参数能够起到与返回值类似的作用,上面一条规则对函数的出口参数能够起到与返回值类似的作用,上面一条规则对出口参数同样适用;出口参数同样适用;对于函数返回值为恒值的函数,建议使用对于函数返回值为恒值的函数,建议使用VOID类型的返回值;类型的返回值;HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之返回值有什么问题?有什么问题?#includestdlib.h“VOID main()CHAR*p;p=(CHAR*)malloc(100);VOS_Strcpy(p,“Hel

30、lo World!n”);printf(p);free(p);return;HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之返回值#includestdlib.h“VOID main()CHAR*p;p=(CHAR*)malloc(100);if(NULL!=p)strcpy(p,“Hello World!n”);printf(p);free(p);return;HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之返回值LONG A()if(条件条件1)return;return VOS

31、_OK;VOID B()if(A()DoSomeThing1();else DoSomeThing2();return;HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之返回值LONG A()if(条件条件1)return VOS_ERROR;return VOS_OK;VOID B()if(A()DoSomeThing1();else DoSomeThing2();return;HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.

32、返回值7.强制类型转换8.Switch case9.字符串10.溢出11.资源释放12.If规范13.临界资源保护14.简单既是美HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之强制类型转换强制类型转换给强制类型转换给C语言编程带来了极大的灵活性,也正是这种灵活语言编程带来了极大的灵活性,也正是这种灵活性,也埋下了无数的隐患;性,也埋下了无数的隐患;当目的结构的空间大于源结构的空间时,要重点关注内存访问超当目的结构的空间大于源结构的空间时,要重点关注内存访问超过源结构范围的情形,可能越界;过源结构范围的情形,可能越界;当目的结构的空间小于

33、源结构的空间时,要重点关注对目的结构当目的结构的空间小于源结构的空间时,要重点关注对目的结构赋值不能完全覆盖源结构范围的情形,可能遗漏;赋值不能完全覆盖源结构范围的情形,可能遗漏;与结构体之间的强制类型转换相比,基本数据结构的强制类型转与结构体之间的强制类型转换相比,基本数据结构的强制类型转换更容易出现上面描述的情况,使用的时候,一定要慎之又慎;换更容易出现上面描述的情况,使用的时候,一定要慎之又慎;HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之类型转换目的结构小于源结构VOID B(CHAR*p)*p=1;return;VOID A(

34、)ULONG a;B(CHAR*)(&a);return;a=?,是,是1吗?吗?HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之类型转换目的结构小于源结构VOID B(CHAR*p)*p=1;return;VOID A()ULONG a;B(CHAR*)(&a);return;a=?,是,是1吗?吗?不可预知。不可预知。HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之类型转换目的结构大于源结构VOID B(ULONG*p)*p=1000;return;VOID A()UCHAR a

35、 10;B(ULONG*)(&a);return;在函数在函数B给给*p赋值之前,赋值之前,*p的值是多少?的值是多少?*p赋值之后,会出现什么样的情形?赋值之后,会出现什么样的情形?HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之类型转换目的结构大于源结构VOID B(ULONG*p)*p=1000;return;VOID A()UCHAR a 10;B(ULONG*)(&a);return;在函数在函数B给给*p赋值之前,赋值之前,*p的值是多少?的值是多少?不可预知不可预知*p赋值之后,会出现什么样的情形?赋值之后,会出现什么样的情

36、形?越界越界HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.返回值7.强制类型转换8.Switch case9.字符串10.溢出11.资源释放12.If规范13.临界资源保护14.简单既是美HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之switchcaseC语言使用语言使用switchcase处理一个条件的多个取值有不同的处理分处理一个条件的多个取值有不同的处理分支的情形;支的情形;当所有的当所有的case都匹配不成功时,进

37、入都匹配不成功时,进入default分支,编程规范要求分支,编程规范要求switchcase必须显示设置必须显示设置default分支,如果程序从逻辑上不可能分支,如果程序从逻辑上不可能走到这个分支,可以在该分支中使用断言;走到这个分支,可以在该分支中使用断言;结束结束case分支的执行最常用的办法是使用分支的执行最常用的办法是使用break/return,否则程序,否则程序将自动进入下一个将自动进入下一个case分支继续执行;分支继续执行;编译器对编译器对switchcase可以做优化,用空间换取时间;可以做优化,用空间换取时间;default分支按照编程规范,要求放在分支按照编程规范,要求

38、放在switch case的末尾,的末尾,C语言本语言本身不做强制要求;身不做强制要求;HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之switchcaseVOID main()LONG ulCnt1=0,ulCnt2=0;CHAR*ch=“aha!”;while (*ch)switch(*ch)case a:case h:ulCnt2+;default:ulCnt1+;ch+;printf(%u,%un,ulCnt1,ulCnt2);return;ulCnt1和和ulCnt2分别是多少?分别是多少?HUAWEI TECHNOLOGIES

39、 CO.,LTD.Huawei Confidential 基础篇之switchcaseVOID main()LONG ulCnt1=0,ulCnt2=0;CHAR*ch=“aha!”;while (*ch)switch(*ch)case a:case h:ulCnt2+;default:ulCnt1+;ch+;printf(%u,%un,ulCnt1,ulCnt2);return;ulCnt14 ulCnt2=3HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.返回值7.强制类型转换

40、8.Switch case9.字符串10.溢出11.资源释放12.If规范13.临界资源保护14.简单既是美HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之字符串ULONG BuildRun(CHAR*ppBuildrun)ULONG ulLen;CHAR*pBuf;ulLen=CalculateBuildRunLen();if(0=ulLen)*ppBuildrun=NULL;return B_ZERO_LENGTH;pBuf=VOS_malloc(0,ulLen);if(NULL=pBuf)*ppBuildrun=NULL;retur

41、n B_MALLOC_FAILED;VOS_StrCpy(pBuf,BuildRunInfo);*ppBuildrun=pBuf;return VOS_OK;HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之字符串ULONG BuildRun(CHAR*ppBuildrun)ULONG ulLen;CHAR*pBuf;ulLen=CalculateBuildRunLen();if(0=ulLen)*ppBuildrun=NULL;return B_ZERO_LENGTH;pBuf=VOS_malloc(0,ulLen+1);if(NULL=

42、pBuf)*ppBuildrun=NULL;return B_MALLOC_FAILED;VOS_StrCpy(pBuf,BuildRunInfo);*ppBuildrun=pBuf;return VOS_OK;HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之字符串案例点评:案例点评:l作为信息输出,字符串必不可少;作为信息输出,字符串必不可少;l字符串在动态申请时少分配一个字符是非常普遍的一个错误;字符串在动态申请时少分配一个字符是非常普遍的一个错误;lstrlen等计算字符串长度的函数都是不考虑字符串的等计算字符串长度的函数都是不考虑

43、字符串的0结束符的;结束符的;l代码代码Review时,字符串越界问题是一个大客户,要盯紧看严;时,字符串越界问题是一个大客户,要盯紧看严;HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之字符串(续)再看一个例子:再看一个例子:LONG GetXYZHead(CHAR*pData,CHAR*pBuf)ULONG ulLen;CHAR*pTmpData=*pData,*pTmpBuf=*pBuf;ulLen=AnalysisHead(pTmpBuf);/*strcpy(pTmpData,pTmpBuf);*/*sprintf(pTmpDat

44、a,“%s”,pTmpBuf);*/*memcpy(pTmpData,pTmpBuf,ulLen);*/return ulLen;*pBuf中存放是是中存放是是XYZ协议的协议的Peer发送过来的一段报文,这个函数负责将协议发送过来的一段报文,这个函数负责将协议头拷贝到头拷贝到pData指向的空间中;指向的空间中;假设空间是足够的,打算选择哪条语句;假设空间是足够的,打算选择哪条语句;HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之字符串(续)LONG GetXYZHead(CHAR*pData,CHAR*pBuf)ULONG ulLen

45、;CHAR*pTmpData=*pData,*pTmpBuf=*pBuf;ulLen=AnalysisHead(pTmpBuf);/*strcpy(pTmpData,pTmpBuf);*/*sprintf(pTmpData,“%s”,pTmpBuf);*/memcpy(pTmpData,pTmpBuf,ulLen);return ulLen;使用使用memcpy,因为没有人保证协议头中不出现,因为没有人保证协议头中不出现0,而且协议头非常,而且协议头非常容易出现这个值,这个时候它就不再是字符串,字符串工具函数容易出现这个值,这个时候它就不再是字符串,字符串工具函数必须是专款专用,而必须是专款专

46、用,而memcpy则要宽泛得多;则要宽泛得多;HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之字符串(再续)VOID GetDigitString(CHAR*pData,CHAR*pBuf)CHAR*pTmpData=pData,*pTmpBuf=pBuf;while(0!=(*pTmpBuf)if(0=*pTmpBuf)*pTmpData=*pTmpBuf;pTmpData+;else break;pTmpBuf+;return;该函数的功能是将该函数的功能是将pBuf中的连续数字拷贝到中的连续数字拷贝到pData中生成一个新的字符串中

47、生成一个新的字符串HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之字符串(再续)VOID GetDigitString(CHAR*pData,CHAR*pBuf)CHAR*pTmpData=pData,*pTmpBuf=pBuf;while(0!=(*pTmpBuf)if(0=*pTmpBuf)*pTmpData=*pTmpBuf;pTmpData+;else break;pTmpBuf+;*pTmpData=0;/*没有尾字符,就不是字符串没有尾字符,就不是字符串*/return;HUAWEI TECHNOLOGIES CO.,LTD.

48、Huawei Confidential 目录1.前言2.sizeof3.字节对齐4.字节序5.函数参数6.返回值7.强制类型转换8.Switch case9.字符串10.溢出11.资源释放12.If规范13.临界资源保护14.简单既是美HUAWEI TECHNOLOGIES CO.,LTD.Huawei Confidential 基础篇之溢出#define DEFAULT_EXPIRE_TIME 300000 /*5分钟分钟*/VOID ARPRecordExpireTime(ARP_Entry_S*pArpEntry)/*计算表项预计老化时的时间,以系统启动以来的毫秒数表示计算表项预计老化时

49、的时间,以系统启动以来的毫秒数表示*/pARPEntry-ulExpireTime=GetBootTime()+DEFAULT_EXPIRE_TIME;return;VOID*ARPExpire(ARP_Entry_S*pArpEntry)ARP_Entry_s*pArpNext;while(pArpEntry)if(GetBootTime()ulExpireTime)break;pArpNext=pArpEntry-pNext;Free(pArpEntry);pArpEntry=pArpNext;return(VOID*)pArpEntry;HUAWEI TECHNOLOGIES CO.,L

50、TD.Huawei Confidential 基础篇之溢出#define DEFAULT_EXPIRE_TIME 300000 /#define DEFAULT_EXPIRE_TIME 300000 /*5 5分钟分钟 */VOID ARPRecordExpireTime(ARP_Entry_S VOID ARPRecordExpireTime(ARP_Entry_S*pArpEntry)pArpEntry)/*计算表项预计老化时的时间,以系统启动以来的毫秒数表示计算表项预计老化时的时间,以系统启动以来的毫秒数表示 */pARPEntry-ulExpireTime=GetBootTime()+

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(C语言编程基础概要课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|