风舞残阳 2008-4-1 16:49
Linux应聘常考题: C中的strcpy()函数
很多公司用这个函数考察应聘者的一些技能,如代码风格、代码成熟度等。首先要避免国内一些教科书的误导的诸如while(*dest=*src)这样的代码。我把参考写法如下(纯C代码):-----------------------------------------------------------------------------000001#include002003#defineBOUNDS_VIOLATED(__builtin_trap(),0)004005#defineCHECK_BOUNDS_LOW(ARG)\006(((__ptrvalue(ARG)%26lt;__ptrlow(ARG))%26;amp;%26;amp;BOUNDS_VIOLATED),\007__ptrvalue(ARG))008009#defineCHECK_BOUNDS_HIGH(ARG)\010(((__ptrvalue(ARG)%26gt;__ptrhigh(ARG))%26;amp;%26;amp;BOUNDS_VIOLATED),\011__ptrvalue(ARG))012013/*copysrctodest*/014char*015strcpy(char*dest,constchar*src)016{017registercharc;018char*__unboundeds=(char*__unbounded)CHECK_BOUNDS_LOW(src);019constptrdiff_toff=CHECK_BOUNDS_LOW(dest)-s-1;020size_tn;021do{022c=*s;023s[off]=c;024}while(c!='\0');025n=s-src;026(void)CHECK_BOUNDS_HIGH(srcn);027(void)CHECK_BOUNDS_HIGH(destn);028returndest;029}030要注意的有:1、第003行宏调用的函数为指针越界陷阱系统调用(boundscheck,即int$5);2、第006行的‘%26;amp;%26;amp;’和‘,’符号在宏中的用法;3、数据类型的定义,诸如ptrdiff_t,size_t等的使用;4、第023的s指针为什么高效,如寄存器使用数量是最少的;5、第026行为什么要返回void类型;如果你这些都已经很熟悉了,我相信没有公司可以立即拒绝你。有问题大家探讨,一起学习成长。
[color=#FFFFFF'][/color]
j7nv8 2008-6-23 20:08
::loveliness: ::loveliness: