CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

我也来贴几道面试题

楼主winzop(him)2006-10-12 17:41:09 在 C/C++ / C语言 提问

1.定义一个宏,能够得到一个结构体成员的offset。  
  2.写出自己的strcpy。  
  3.strcpy和memcpy的区别。  
  4.char   *p=malloc(123);   sizeof(p)=?  
  5.定义一个宏得到一个数的平方。  
  6.const   int   *p;和int   *   const   p;区别。  
   
   
  顺便贴下前两题,我做的答案。呵呵,不是我面试时写的,那时写的不好。其他的题目简单,就没贴答案。  
  #define   GET_OFFSET(type,   member,   result)   \  
  {\  
  struct   type   _i;\  
  *result   =   (int)((char   *)(&_i.member)-(char   *)(&_i));\  
  }  
   
  char   *   StryCpy(char   *dst,   const   char*   src)  
  {  
  char*   temp=dst;  
  if(src==NULL)  
  {  
  if(dst)  
  {  
  *dst=0;  
  }  
  return   dst;  
  }  
  if(dst==NULL)  
  return   NULL;  
  while((*temp++=*src++)!=0)  
  ;  
  return   dst;  
  }  
  问题点数:20、回复次数:28Top

1 楼mu_yang(穆扬)回复于 2006-10-12 17:46:46 得分 2

都不对  
  或者都有错Top

2 楼Jim_King_2000()回复于 2006-10-12 17:48:43 得分 5

#define   GET_OFFSET(type,   member)   (&(((type   *)0)->member))Top

3 楼winzop(him)回复于 2006-10-12 19:57:14 得分 0

2L   方法不错啊,估计是最简洁最好的方法了。  
  大家可以写了贴上来看看啊,答案不是唯一的。Top

4 楼xiaoke26(带三个表)回复于 2006-10-12 21:04:17 得分 5

linux代码stddef.h  
  #define   offsetof(TYPE,   MEMBER)   ((size_t)   &((TYPE   *)0)->MEMBER)  
   
  Top

5 楼xiaoke26(带三个表)回复于 2006-10-12 21:08:29 得分 2

#define   SQUARE(data)   ({ \  
                  typeof(data)   temp   =   data; \  
                  temp   *=temp;})Top

6 楼cwl_feng()回复于 2006-10-12 22:50:59 得分 2

4.char   *p=malloc(123);   sizeof(p)=?  
   
  char   *p=malloc(123);   这样不对吧  
  #include   "stdafx.h"  
   
  #include   <iostream>  
   
  using   namespace   std;  
   
  int   main   (void)  
  {  
  char   *p=(char*)malloc(123);    
  int   t=sizeof(p);  
  cout<<t;  
  }  
  结果是4;  
   
   
  Top

7 楼mu_yang(穆扬)回复于 2006-10-12 23:13:42 得分 0

char   *p=malloc(123);   这样不对吧  
  ------------------------------------  
  这在c里面也没什么不对的  
  只是不够好Top

8 楼bravemanly(井水)回复于 2006-10-12 23:54:54 得分 2

对strcpy,我的做法是:  
  #include   <stdlib.h>  
  #include   <assert.h>  
   
  char   *strcpy(char   *dst,const   char   *src)  
  {  
          assert((dst!=NULL)   &&   (src!=NULL));  
           
          while((*dst++   =*src++)!='\0');  
   
          return   dst;  
  }  
  ...  
   
  我想问问为什么有很多资料上strcpy都是按照下面的来实现的:  
   
  char   *strcpy(char   *dst,const   char   *src)  
  {  
          assert((dst!=NULL)   &&   (src!=NULL));  
           
          char   *temp=dst;  
   
          while((*temp++   =*src++)!='\0');  
   
          return   dst;  
  }  
  结果都是一样的,但是为什么我看到有些面试给分时,在函数内部定义了一个局部临时变量的后面设置了分数?在函数栈空间加入局部变量或者对象只会带来额外的时间开销,并且影响效率,为什么有很多都在实现这个strcpy函数时加入了临时指针?向高手请教。  
  Top

9 楼mu_yang(穆扬)回复于 2006-10-12 23:57:37 得分 0

return   dst  
  已经不再是最初的sdt了  
  局部临时变量是必须的Top

10 楼bravemanly(井水)回复于 2006-10-13 00:24:25 得分 0

按我的那种方法没有用到临时局部指针变量,结果还是一样的,按照高效C++编程,尽量不返回栈空间的引用和指针。继续请教高手!Top

11 楼mu_yang(穆扬)回复于 2006-10-13 00:45:16 得分 0

如果是  
  void   strcpy(char   *dst,const   char   *src)  
  你的写法无可非议  
  但  
  char   *strcpy(char   *dst,const   char   *src)  
  为的是  
  比如  
  printf("%s",strcpy(dst,"abc"));  
  这样差别就显现了Top

12 楼mu_yang(穆扬)回复于 2006-10-13 08:14:01 得分 0

"尽量不返回栈空间的引用和指针"  
  -------------------------------------  
  temp与dst都不是"栈空间的引用和指针"  
  "不返回栈空间的引用和指针"  
  不等于  
  "不返回栈空间的值"Top

13 楼winzop(him)回复于 2006-10-13 09:08:36 得分 0

4.char   *p=malloc(123);   sizeof(p)=?  
  少了类型转换,4.char   *p=(char   *)malloc(123);   sizeof(p)=?这样就可以了。Top

14 楼doudouHuY()回复于 2006-10-13 09:17:35 得分 0

同意mu_yang(穆扬)   ,可能出现strlen(strcpy(dst,src))之类的用法Top

15 楼dead_of_winter(寒冬)回复于 2006-10-13 09:25:50 得分 0

strcpy是不是不论怎么写都可能存在溢出?Top

16 楼mu_yang(穆扬)回复于 2006-10-13 09:30:16 得分 0

strcpy是不是不论怎么写都可能存在溢出?  
  -----------------------------------------  
  如果你说的"溢出"是指越界的话  
  的确如此  
  在函数内部无法判断dst可以用多少空间  
  除非再加一个参数  
  Top

17 楼Lingzhi_2006()回复于 2006-10-13 10:22:51 得分 0

--------------------Configuration:   tangkefeng   -   Win32   Debug--------------------  
  Compiling...  
  tangkefeng.c  
  E:\学习工具\tangkefeng.c(10)   :   error   C2001:   newline   in   constant  
  E:\学习工具\tangkefeng.c(11)   :   error   C2143:   syntax   error   :   missing   ')'   before   'if'  
  E:\学习工具\tangkefeng.c(12)   :   error   C2181:   illegal   else   without   matching   if  
  E:\学习工具\tangkefeng.c(13)   :   error   C2001:   newline   in   constant  
  E:\学习工具\tangkefeng.c(14)   :   error   C2146:   syntax   error   :   missing   ')'   before   identifier   'c'  
  E:\学习工具\tangkefeng.c(19)   :   error   C2371:   'max'   :   redefinition;   different   basic   types  
                  E:\学习工具\tangkefeng.c(6)   :   see   declaration   of   'max'  
  E:\学习工具\tangkefeng.c(21)   :   error   C2065:   'a'   :   undeclared   identifier  
  E:\学习工具\tangkefeng.c(21)   :   error   C2065:   'b'   :   undeclared   identifier  
  E:\学习工具\tangkefeng.c(22)   :   error   C2059:   syntax   error   :   'bad   suffix   on   number'  
  E:\学习工具\tangkefeng.c(22)   :   error   C2146:   syntax   error   :   missing   ';'   before   identifier   'a'  
  E:\学习工具\tangkefeng.c(22)   :   error   C2059:   syntax   error   :   'bad   suffix   on   number'  
  E:\学习工具\tangkefeng.c(22)   :   error   C2146:   syntax   error   :   missing   ';'   before   identifier   'b'  
  E:\学习工具\tangkefeng.c(22)   :   warning   C4552:   '-'   :   operator   has   no   effect;   expected   operator   with   side-effect  
  执行   cl.exe   时出错.  
   
  tangkefeng.obj   -   1   error(s),   0   warning(s)  
  这是什么错误啊?????  
  Top

18 楼wanghi(海海)回复于 2006-10-13 10:40:15 得分 0

路过Top

19 楼eroscheng(成功)回复于 2006-10-13 10:49:56 得分 0

学习Top

20 楼Happymax()回复于 2006-10-13 11:35:41 得分 0

我晕。Top

21 楼jazy()回复于 2006-10-13 11:39:08 得分 0

to   mu_yang(穆扬):  
  while((*dst++   =*src++)!='\0');  
  是先++还是先*?先++的话指针被移动了,即使void   strcpy(char   *dst,const   char   *src)照样出错,跟返回值无关吧?Top

22 楼mu_yang(穆扬)回复于 2006-10-13 11:47:38 得分 0

jazy()   :  
  我没太懂你的意思  
  如果你说的是  
  *dst++   =*src++可能具有二义性  
  那我不反对  
  但  
  while((*dst++   =*src++)!='\0');  
  是c的经典句型  
  到目前为止我还没看到有编译器敢于冒犯它  
   
  Top

23 楼tlz1016()回复于 2006-10-13 12:29:38 得分 0

to   bravemanly(井水)   :  
  你说的那个编程风格是   《c/c++高质量编程指南》提到的。。。  
  Top

24 楼winzop(him)回复于 2006-10-13 12:58:09 得分 0

下面来说说这次面试的一些故事:  
  面试是在下午4点,由于面试的地方比较远,请了4小时的假,下午2点钟出发。坐了40分钟的轻轨赶到,发现还提前了半小时。  
  到那边后,先和前台妹妹打了个招呼,告诉她我是来面试的。她让我去坐一会儿。等了一会儿后,她拿来一份试卷让我到楼下会议室做题。没找到只能在过道旁边的一张桌子上做。她给我倒了杯水,说过1个小时来收试卷。  
  试卷上大概有12、3题面试题目是英语写的,和计算机相关,还好不是太困难。面试题里考了一些C++的题目,一道都没做,所以在这里也没贴出来。我平时的工作只用c,对c++的那些新的概念一无所知。  
  做那些c题目也就花了不到半小时,全部做好了。于是自己跑到楼上去找前台妹妹交试卷,人不在,又等了一会儿。人来了之后把我试卷交给一个管人事样子的女士手里,大概比我大个2、3岁。她叫我到楼下的会议室去,可能是面试了。想到出门前和同事开的玩笑,电话里女的声音真好听,到时应该认识一下,不能做同事也可以做个朋友啊。于是和她闲聊起来,当她听到我出来面试同事知道的事后,她样子很惊讶,到现在我都没搞清楚原因,当时也没问她。  
  到了会议室后,一个很小的房间,她叫我等一会儿,然后出去了。过了一段时间后来说,今天面试的人有事不在,叫我回去等通知。道别后,面试结束。  
  又坐了40分钟的轻轨,直接回家了。回来后,上网看看考的c题,发现自己写的还是有不少问题的。本以为自己的c基础可以了,想不到阿,哈哈可能和平时写的太少有关系了。当时出去面试时,同事开玩笑地说,别给公司丢脸。看来这下是丢了。:〉Top

25 楼myrene()回复于 2006-10-13 13:00:36 得分 2

char   *strcpy(char   *strDest,   const   char   *strSrc);  
   
  {  
   
          assert((strDest!=NULL)   &&   (strSrc   !=NULL));        
   
          char   *address   =   strDest;                                          
          while(   (*strDest++   =   *   strSrc++)   !=   ‘\0’   );    
   
          return   address   ;                                                          
  }  
   
  Top

26 楼ycqing()回复于 2006-10-13 13:20:44 得分 0

UPTop

27 楼xuqing1980()回复于 2006-10-13 14:44:15 得分 0

#define   SQUARE(data)   ({\  
                  typeof(data)   temp   =   data;\  
                  temp   *=temp;})  
   
   
  -------  
  为什么代码中如此运行出错呢?Top

28 楼vsong(房价越来越高,所以,好男人越来越少……)回复于 2006-10-13 17:01:44 得分 0

mark  
  楼主多看书Top

相关问题

关键词

得分解答快速导航

  • 帖主:winzop
  • mu_yang
  • Jim_King_2000
  • xiaoke26
  • xiaoke26
  • cwl_feng
  • bravemanly
  • myrene

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo