我也来贴几道面试题
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




