程序员笔试面试.doc
《程序员笔试面试.doc》由会员分享,可在线阅读,更多相关《程序员笔试面试.doc(53页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、先发基本问题,再发编程问题.想成为嵌入式程序员应知道的 0x10 个基本问题:1:(void *)ptr 和 (*(void*)ptr 的结果是否相同?其中 ptr 为同一个指针 .(void *)ptr 和 (*(void*)ptr 值是相同的 2:int main()int x=3;printf(“%d“,x);return 1;问函数既然不会被其它函数调用,为什么要返回 1? mian 中,c 标准认为 0 表示成功,非 0 表示错误。具体的值是某中具体出错信息1,要对绝对地址 0x100000 赋值,我们可以用 (unsigned int*)0x100000 = 1234;那么要是想让
2、程序跳转到绝对地址是 0x100000 去执行,应该怎么做? *(void (*)( )0x100000 ) ( );首先要将 0x100000 强制转换成函数指针,即: (void (*)()0x100000然后再调用它: *(void (*)()0x100000)();用 typedef 可以看得更直观些: typedef void(*)() voidFuncPtr; *(voidFuncPtr)0x100000)();2,已知一个数组 table,用一个宏定义,求出数据的元素个数 #define NTBL #define NTBL (sizeof(table)/sizeof(table0
3、)面试题: 线程与进程的区别和联系? 线程是否具有相同的堆栈? dll 是否有独立的堆栈? 进程是死的,只是一些资源的集合,真正的程序执行都是线程来完成的,程序启动的时候 操作系统就帮你创建了一个主线程。每个线程有自己的堆栈。 DLL 中有没有独立的堆栈,这个问题不好回答,或者说这个问题本身是否有问题。因为 DLL 中的代码是被某些线程所执行,只有线程拥有堆栈,如果 DLL 中的代码是 EXE 中的线程所 调用,那么这个时候是不是说这个 DLL 没有自己独立的堆栈?如果 DLL 中的代码是由 DLL 自己创建的线程所执行,那么是不是说 DLL 有独立的堆栈?以上讲的是堆栈,如果对于堆来说,每个
4、 DLL 有自己的堆,所以如果是从 DLL 中动态分配的内存,最好是从 DLL 中删除,如果你从 DLL 中分配内存,然后在 EXE 中,或者另外一个 DLL 中删除,很有可能导致程序崩溃unsigned short A = 10; printf(“A = %un“, A);char c=128; printf(“c=%dn“,c);输出多少?并分析过程 第一题,A 0xfffffff5,int 值 为11,但输出的是 uint。所以输出 4294967285 第二题,c0x10,输出的是 int,最高位为 1,是负数,所以它的值就是 0x00 的补码就是 128,所以输出128。 这两道题都
5、是在考察二进制向 int 或 uint 转换时的最高位处理。分析下面的程序: void GetMemory(char *p,int num) *p=(char *)malloc(num); int main() char *str=NULL;GetMemory(strcpy(str,“hello“);free(str);if(str!=NULL)strcpy(str,“world“); printf(“n str is %s“,str);getchar(); 问输出结果是什么?希望大家能说说原因,先谢谢了 输出 str is world。 free 只是释放的 str 指向的内存空间,它本身的
6、值还是存在的. 所以 free 之后,有一个好的习惯就是将 str=NULL.此时 str 指向空间的内存已被回收,如果输出语句之前还存在分配空间的操作的话,这段存储 空间是可能被重新分配给其他变量的, 尽管这段程序确实是存在大大的问题(上面各位已经说得很清楚了) ,但是通常会打印出 world 来。 这是因为,进程中的内存管理一般不是由操作系统完成的,而是由库函数自己完成的。 当你 malloc 一块内存的时候,管理库向操作系统申请一块空间(可能会比你申请的大一些) ,然后在这块空间中记录一些管理信息(一般是在你申请的内存前面一点) ,并将可用内存 的地址返回。但是释放内存的时候,管理库通常
7、都不会将内存还给操作系统,因此你是可 以继续访问这块地址的,只不过。 。 。 。 。 。 。 。楼上都说过了,最好别这么干。char a10,strlen(a)为什么等于 15?运行的结果#include “stdio.h“ #include “string.h“void main() char aa10; printf(“%d“,strlen(aa); sizeof()和初不初始化,没有关系; strlen()和初始化有关。char (*str)20;/*str 是一个数组指针,即指向数组的指针*/ char *str20;/*str 是一个指针数组,其元素为指针型数据*/long a=0x
8、801010; a+5=?0x801010 用二进制表示为:“1000 0000 0001 0000 0001 0000” ,十进制的值为 8392720, 再加上 5 就是 8392725 罗1)给定结构 struct A char t:4;char k:4;unsigned short i:8;unsigned long m;问 sizeof(A) = ? 给定结构 struct A char t:4; 4 位char k:4; 4 位unsigned short i:8; 8 位 unsigned long m; / 偏移 2 字节保证 4 字节对齐 ; / 共 8 字节 2)下面的函数
9、实现在一个数上加一个数,有什么错误?请改正。 int add_n ( int n ) static int i = 100;i += n;return i; 当你第二次调用时得不到正确的结果,难道你写个函数就是为了调用一次?问题就出在 static 上?/ 帮忙分析一下 #include #include #include #include #include #include typedef struct AA int b1:5;int b2:2; AA; void main() AA aa;char cc100;strcpy(cc,“0123456789abcdefghijklmnopqrs
10、tuvwxyz“);memcpy(cout 0 分析: struct bit int a:3; int b:2; int c:3; ; int main() bit s; char *c=(char*) coutint main(void) int *p;int arr100;p = return 0; 解答: 搞错了,是指针类型不同, int *p; /二级指针/得到的是指向第一维为 100 的数组的指针 #include int main(void) int *p, *q; int arr100; q = arr; p = return 0; 下面这个程序执行后会有什么错误或者效果:#de
11、fine MAX 255int main() unsigned char AMAX,i;/i 被定义为 unsigned charfor (i=0;i #include int main(void) int MAX = 10; int *a = (int *)malloc(MAX * sizeof(int); int *b;FILE *fp1; FILE *fp2;fp1 = fopen(“a.txt“,“r“); if(fp1 = NULL) printf(“error1“);exit(-1); fp2 = fopen(“b.txt“,“w“); if(fp2 = NULL) printf(
12、“error2“);exit(-1); int i = 0;int j = 0;while(fscanf(fp1,“%d“, j+; if(i = MAX) MAX = 2 * MAX; b = (int*)realloc(a,MAX * sizeof(int); if(b = NULL) printf(“error3“); exit(-1); a = b; for(;-j = 0;)fprintf(fp2,“%dn“,aj);fclose(fp1); fclose(fp2);return 0; 第二题. #include int main(void) unsigned long int i,
13、j,k;printf(“please input the numbern“); scanf(“%d“,if( i % 2 = 0)j = i / 2; else j = i / 2 + 1;printf(“The result is n“);for(k = 0; k void main() unsigned long int a,i=1; scanf(“%d“, if(a%2=0) for(i=1;i void test(FILE *fread, FILE *fwrite) char buf1024 = 0;if (!fgets(buf, sizeof(buf), fread)return;t
14、est( fread, fwrite );fputs(buf, fwrite); int main(int argc, char *argv) FILE *fr = NULL;FILE *fw = NULL;fr = fopen(“data“, “rb“);fw = fopen(“dataout“, “wb“);test(fr, fw);fclose(fr);fclose(fw);return 0; 在对齐为 4 的情况下 struct BBB long num;char *name;short int data;char ha;short ba5; *p; p=0x1000000; p+0x
15、200=_; (Ulong)p+0x200=_; (char*)p+0x200=_;希望各位达人给出答案和原因,谢谢拉 解答:假设在 32 位 CPU 上,sizeof(long) = 4 bytes sizeof(char *) = 4 bytes sizeof(short int) = sizeof(short) = 2 bytes sizeof(char) = 1 bytes由于是 4 字节对齐, sizeof(struct BBB) = sizeof(*p) = 4 + 4 + 2 + 1 + 1/*补齐*/ + 2*5 + 2/*补齐*/ = 24 bytes (经 Dev-C+验证
16、)p=0x1000000; p+0x200=_;= 0x1000000 + 0x200*24(Ulong)p+0x200=_;= 0x1000000 + 0x200(char*)p+0x200=_;= 0x1000000 + 0x200*4你可以参考一下指针运算的细节写一段程序,找出数组中第 k 大小的数,输出数所在的位置。例如2,4,3,4,7中,第 一大的数是 7,位置在 4。第二大、第三大的数都是 4,位置在 1、3 随便输出哪一个均可。 函数接口为:int find_orderk(const int* narry,const int n,const int k) 要求算法复杂度不能是
17、O(n2) 谢谢! 可以先用快速排序进行排序,其中用另外一个进行地址查找 代码如下,在 VC+6.0 运行通过。给分吧-/快速排序#includeusingnamespacestd;intPartition (int*L,intlow,int high) inttemp = Llow; intpt = Llow;while (low = pt)-high; Llow = Lhigh; while (low t;while (t != -1) narrysum = t; addrsum - 1 = t; sum+;cin t; sum -= 1; QSort (narry,1,sum);for
18、(int i = 1; i k;intaa = 1; intkk = 0; for (;) if (aa = k) break; if (narrykk != narrykk + 1) aa += 1; kk+; cout next!=NULL qa=qa-next; else ra-next=pa; pa=pa-next; if(pa-next!=NULL) ra-next=pa; if(qa-next!=NULL) ra-next=qa; return R; 2、运用四色定理,为 N 个局域举行配色,颜色为 1、2、3、4 四种,另有数组 adjN,如 adjij=1 则表示 i 区域与
19、j 区域相邻,数组 colorN,如 colori=1,表示 i 区域的颜色为 1 号颜色。 四色填充 3、用递归算法判断数组 aN是否为一个递增数组。 递归的方法,记录当前最大的,并且判断当前的是否比这个还大,大则继续,否则返回 false 结束:bool fun( int a, int n ) if( n= =1 ) return true; if( n= =2 ) return an-1 = an-2; return fun( a,n-1) 4、编写算法,从 10 亿个浮点数当中,选出其中最大的 10000 个。 用外部排序,在数据结构书上有 计算方法导论在找到第 n 大的数的算法上加工
20、 5、编写一 unix 程序,防止僵尸进程的出现.同学的 4 道面试题,应聘的职位是搜索引擎工程师,后两道超级难, (希望大家多给一些算 发) 1.给两个数组和他们的大小,还有一动态开辟的内存,求交集,把交集放到动态内存 dongtai,并且返回交集个数 long jiaoji(long* a,long b,long* alength,long blength,long* dongtai)2.单连表的建立,把a-z26 个字母插入到连表中,并且倒叙,还要打印! 方法 1: typedef struct val int date_1;struct val *next; *p;void main(
21、void) char c;for(c=122;c=97;c-) p.date=c;p=p-next;p.next=NULL; 方法 2: node *p = NULL; node *q = NULL;node *head = (node*)malloc(sizeof(node); head-data = ;head-next=NULL;node *first = (node*)malloc(sizeof(node);first-data = a;first-next=NULL;head-next = first; p = first;int longth = z - b; int i=0; w
22、hile ( idata = b+i;temp-next=NULL;q=temp;head-next = temp; temp-next=p;p=q; i+; print(head);3.可怕的题目终于来了 象搜索的输入信息是一个字符串,统计 300 万输入信息中的最热门的前十条,我们每次输 入的一个字符串为不超过 255byte,内存使用只有 1G, 请描述思想,写出算发(c 语言) ,空间和时间复杂度, 4.国内的一些帖吧,如 baidu,有几十万个主题,假设每一个主题都有上亿的跟帖子,怎么样 设计这个系统速度最好,请描述思想,写出算发(c 语言) ,空间和时间复杂度,#include s
23、tring.h main(void) char *src=“hello,world“;char *dest=NULL;dest=(char *)malloc(strlen(src);int len=strlen(str);char *d=dest;char *s=srclen;while(len-!=0)d+=s-;printf(“%s“,dest); 找出错误! #include “string.h“ #include “stdio.h“ #include “malloc.h“ main(void) char *src=“hello,world“;char *dest=NULL;dest=(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序员 笔试 面试
限制150内