C语言编程基础培训(2011)_第1页
C语言编程基础培训(2011)_第2页
C语言编程基础培训(2011)_第3页
C语言编程基础培训(2011)_第4页
C语言编程基础培训(2011)_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、c语言编程基础训练v0.1,应用研究组,目录,1。简单就是美丽。尺寸为3。字节顺序4。功能参数5。返回值6。强制类型转换7 .使用情况8。弦9。资源版本10。if规格11。关键资源保护,1。简单就是美丽,优先顺序还不清楚。带括号的复合语句太冗长。分成几行写三个无编码原则。不要挑战你的记忆,不要挑战你的耐心,不要挑战编译器的水平。编码的三个原则可以使用简单的句子,不使用复杂的技能,使用成熟的代码,不使用一套工具,必须机械化。2.数据结构是C语言的基础。C语言的灵活性在于其数据结构的灵活性。要使用好的数据结构,首先必须掌握数据结构大小的计算。系统的每个数据组织和变量将被分配一个相应的存储空间,这个

2、存储空间的大小就是数据结构的大小。Sizeof是编译时的一元运算符,可用于计算任何对象的大小。因此,编译时的常量sizeof不能用于函数类型、不完整类型或位字段。不完整类型是指存储大小未知的数据类型。例如具有未知存储大小的阵列类型、未知内容的结构或联合类型、无效类型等。3。字节顺序,X86系统void qosconfigpolicy(XXX)uld estip=从命令行读取用户配置的参数;pQosPoliscy-uld estip=uld estip;返回;主机处理无效的服务质量分类数据;如果(pQosPolicy-uld estip=PLP-uld estip)VOS _ HTONL(pQo

3、sPolicy-uld estip);DoSomething();返回;3。字节顺序。由于历史原因,世界上有两种字节顺序标准:双字节和小字节。个人电脑是大终端,X86是小终端。一些处理器可以通过寄存器设置支持不同的字节顺序。例如MIPS。双端字节在低字节,小端字节在高字节,低字节和高字节。例如0 x345678。内存存储顺序从低到高依次为00、34、56、78;从低到高,小型内存按78、56、34、00和3字节的顺序存储。为了解决不同字节顺序的处理单元之间的通信问题,国际上定义了主机顺序和网络顺序的概念。网络顺序主要用于信息传输,但一般不用于计算,其字节顺序与大端一致。除了在编码时收紧这个字符

4、串之外,我们在选择设备时选择具有相同主机序列和网络序列的芯片,并且相同设备的不同板使用相同的字节序列。优先考虑支持大头的芯片,这样即使问题不能完全解决,也可以完全避免。功能参数。在C语言中,函数通过返回值和参数与调用方交换信息。由函数参数占用的存储单元在堆栈中分配。由入口参数指向的数组或地址被复制到函数入口的堆栈区域,因此函数参数所在的存储位置的直接修改在函数外部不起作用,但是由存储在参数存储位置中的地址指向的存储空间的修改在函数外部起作用。在调用函数之前,调用方必须预先声明被调用函数的原型,包括返回值类型和参数类型。4。函数参数,CHAR *GetMemory(CHAR *p) /*应用程序

5、内存*/p=(CHAR *)malloc(100);返回p。/* malloc申请的内存空间与操作系统有关。在个人计算机中,malloc申请的存储空间是字节。如果应用100个int存储器,p=(INT *)malloc(400);*/VOID测试(VOID)CHAR *字符串=空;如果(空!=GetMemory(str)str copy(str,“hell world”);printf(str);返回;5。返回值。在C语言中,函数的调用方通过返回值知道函数的执行。函数的默认返回值类型是int,编程规范要求必须显示已定义函数的返回类型。对于反映函数执行状态的返回值,调用方必须根据返回值进行处理,

6、尤其是当函数执行异常时。函数的退出参数可以起到与返回值类似的作用,前一个参数也适用于退出参数。对于具有常量返回值的函数,建议使用void返回值。5.返回值,主函数的返回值是int,主函数有以下两种形式(C99):int main(void)int main(int argc,Char*argv)(参考:国际标准化组织/国际电工委员会989933601999(e)编程语言C5.1.2.2.1程序启动)定义void main ()/*.*/不是也从来不是c,bjarne stroustrup,也不是c.c. 6之父。强制类型转换给c编程带来了极大的灵活性,正是这种灵活性埋下了无数的隐患。当目标结构

7、的空间大于源结构的空间时,有必要注意存储器访问超出源结构的范围的情况,这可能是越界的。当目的结构的空间小于源结构的空间时,应注意目的结构的赋值不能完全覆盖源结构的范围,这种情况可以省略。与结构间的强制类型转换相比,基础数据的强制类型转换更容易出现上述情况。6。强制类型转换,目标结构小于源结构的无效B(char * p)* p=1;返回;无效(ULONG)A;(char*)(a=?是1吗?答案是:不可预测,6。强制类型转换,目标结构大于源结构的空位B(ULONG * p)* p=1000;返回;无效A(UCHAR)A=10;在函数b给p赋值之前,p的值是多少?*分配P时会发生什么?答案:不可预测

8、,答案:出界,7。开关盒,C语言使用开关盒来处理一个条件的多个值有不同处理分支的情况。当所有案例匹配不成功时,输入默认分支。如果程序逻辑上不可能进入这个分支,您可以在这个分支中使用断言。结束案例分支执行的最常见方式是使用中断/返回,否则程序将自动进入下一个案例分支继续执行。编译器可以优化开关.案例,用空间换时间。根据编程规范,默认分支需要放在开关盒的末端,而C本身并没有强制要求。7。开关箱,主真空(LONG)ulc nt1=0,ulc nt2=0;CHAR *ch=啊哈!;而(*ch)开关(*ch)外壳a:外壳h: ulcnt2default: ulcnt1ch;printf (%u,%un

9、,ulcnt1,ulc nt2);返回;什么是ulcnt1和ulcnt2?ulcnt1=4,ulcnt2=3,8。信息输出需要字符串。动态应用时少分配一个字符是一个非常常见的错误。strlen和其他用于计算字符串长度的函数不考虑字符串的零结束符。在审查代码时,字符串交叉的问题是一个大问题,所以我们应该密切关注它。8.字符串,sizeof和stn sizeof (Char)=4,strlen(Char)=3 Char= ab0c ;Sizeof (char)=5,strlen (char)=2 sizeof()用于编译时执行,strlen()用于运行时执行,8。字符串,长getxyhead (c

10、har * * pdata,char * * pbuf)ulongullen;CHAR *ptmpdata=*pdata,* ptmbuf=* pbufullen=analysis head(ptmpbuf);/strcpy(ptmpdata,pt mpbuf);/sprintf(ptmpdata,ptmpbuf,ullen);/memcpy(ptmpdata,ptmpbuf,ullen);返回ullen*pbuf存储由xyz协议的对等方发送的消息。这个函数负责将协议头复制到pdata指向的空间。假设空间足够大,哪种说法最合适?Memcpy语句是最合适的语句,因为没有人能保证0不会出现在*pb

11、uf中,而且它很容易出现在协议头中。此时,它不再是一个字符串,字符串工具功能必须是专用的,而memcpy的范围要广得多。,8。字符串,void getdigitstring (char * pdata,char * pbuf)char * PTM data=pdata,* p tmpbuf=pbuf而(0!=(* . ptmpbuf)if(0=* ptmpbuf)* ptmpdata=* ptmpbuf;ptmpdata否则打破;ptmpbuf* pt mpdata=0;/*如果没有0,它就不是字符串*/return;这个函数的作用是将pbuf中的连续数字复制到pdata中,生成一个新的字符串

12、!8。字符串,# define buffer _ size 250 void test(void)char pszbuffbuffer _ size= 0 ;sprintf(pszbuf, File: %s Line: %d ,_FILE_,_ LINe _);snprintf(pszbuf,sizeof(pszbuf)-1,“File:%s Line: %s”,_FILE_,_ LINe _);pszbufsizeof(pszbuf)-1=0;printf(“% s”,PSZ buf);返回;#定义BUFFER_SIZE 250无效测试(char *pszmsg) char *pszbuf=

13、空;如果(空=pszmsg)返回;PSZ buf=malloc(BUFFER _ SIZE 1);if (pszbuf!=NULL ) strncpy(pszbuf,pszmsg,BUFFER _ SIZE);pszbuf BUFFER _ SIZE=0;免费(PSZ buf);返回;C语言提供的函数库字符串函数Sprintf/vsprintf/str cpy/str cat/get非常危险,很容易导致内存越界。应该使用安全字符串库函数s printf/strn cpy/strn cat/fgets来指定操作内存大小。当复制的字符串达到指定长度时,strncpy等安全函数不会在目标字符串的末尾

14、添加0,但必须手动添加0,这可以在调用Strncpy后立即分配,或者在申请内存时将最后一个字节设置为0。8。字符串,函数函数:打印出可容纳在190字节空间中的非负整数,按从小到大的顺序排列。#定义BUFFER _ SIZE 190 void main(void)char szbuf BUFFER _ SIZE=0;int I=0;对于(;当i=10时,每个整数占用两个字节。100个周期后,缓冲区的总长度(包括0)将超过190,导致内存写入超出界限。以上例子是手工计算字符串长度时的典型错误,其中100是手工计算的幻数。幻数是指出现在代码中的不可理解的数字。这里的代码不仅指*。c文件,还可以对宏进

15、行定义。简单地用宏来代替,神奇的数字不会消失。正确的方法是使用宏来表示数字的含义,并根据一些基本数字自动计算派生数字。在任何情况下都不要手动计算数字!计算数字的工作应该由计算机来完成。8。字符串,#定义缓冲区_大小190 void main (void) charszbuf缓冲区_大小=0;int I=0;int位置=0;/*记录每个副本的起始位置*/int length=0;/*记录每个副本中的字符数(不包括0) */对于(;I)长度=snprintf(snbuf iposition,(BUFFER_SIZE-1)-iposition,%d ,I);如果(长度=0) /*如果长度=0,则表示到达缓冲区的末尾,并且循环结束!*/szbufiposition=0;休息;I位置=长度;printf (%sn ,szbuf);返回;9。资源释放,无效打印数字(ulong ul数据)char * pbuf。pbuf=(char *)malloc(16);如果返回空

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论