好几天前的笔试。今天去九龙坡面试了一趟。遇上辅导员找咱还三方协议,虽然是悄悄的拿的,但就是不想还回去。深圳锐明视讯的宣讲会流程为:宣讲会(1小时左右)-->笔试(1小时半),然后过两三天的时间部分同学就会收到面试通知。我去面试了一遭,然后将笔试(软件工程师的笔试题)和面试的经历记录如下。
在软件和硬件之间徘徊了一下还是坐到了软件工程师的一排,笔试内容分为专业知识考查及综合测评。专业笔试主要是C语言,包括“printf”、“位运算符”、“局部指针(栈内存)”、“二级指针”、“动、静态局部变量”、“强制类型转换“、“简单递归”、“sizeof”、“结构体和联合体内存对齐”、“switch-case”、“字符串拷贝函数实现”、“简单递归函数编写”、“基本排序算法编写”、“链表的插入、删除等简单操作函数编写”。综合测评包含“数字规律”、“图形规律”、“应用题”。答案是我自己做的,感谢找虫者。面试分一面和二面。
C语言笔试由两部分组成:读程序和写程序。读程序大多是参进一些C语言的基本知识和printf连考,具体的题目记不起来了,想其每年的题目都会发生变化。主要笔记以下几个C知识点。
C的内存对齐的笔记在: C struct内存对齐 union的大端小端 笔记中。
暂且假设这个说法正确:int占多少个字节是由编译器决定的,ANSI标准定义int是占2个字节。
#include <stdio.h> int main(void) { union stu_1{ int age; int gread[4]; char name[17]; char sex; }; struct { int age; char name[4]; char sex; }stu_2; printf("\nunion size: %d, struct size:%d", sizeof(union stu_1), sizeof(stu_2)); return 0; }
这个题目不好做:
如果只考虑联合体与结构体占用内存这个知识点加sizeof(int)值为4,则union stu_1占用最大元素内存:17个字节。stu_2占用所有元素内存之和:4 + 3 +1 = 8个字节。但是,您若将这段代码敲进linux内进行验证,结果可不是这样子的。咋就和书上说的不一样呢?我猜测如下:
在linux下,数据存储最小单元为4个字节。这就是为什么第一个输出结果为20,第二个输出结果为12。只有完全吻合数据存储方式的情况下才能输出书中所述的结果。
所以,答这道题目咱应该在答案后面注明是什么系统(啥存储方式来着)。
动态局部变量存储在栈上。静态局部变量跟全局变量一样存储在数据段的全局区(静态区)。程序考查静态局部变量的生命期。
void sum( int n ) { auto int m = 0; static int k = 5; m++; k += 2; printf(“%d,”, n + m + k); } #include <stdio.h> int main(void) { int i; for(i = 0; i < 4; ++i){ sum(2); } return 0; }
函数被调用4次,每次和增加2,所以答案应该为:10, 12, 14, 16
关于递归函数调用过程在 无聊的递归过程 笔记笔记中。
兴许是考查一下递归的思维,但是在平时的编程中递归使用得实在是太少。由于是简单递归的考查,我使用函数调用的方式将其解答,层层调用,直到函数用分支返回为止。
int sum( int n) { if(n <= 2){ return n; } return sum(n-1) + sum(n-2); }
现在若n为7(一般不会这么大),则sum函数返回多少。
答案:21
考查位运算符作减1的功能。这道题目我做错了。我瞄了一眼,将逻辑设置成:n & n-1相当于”--n;”操作。其实不然,若n为奇数则相当于”--n;”操作;当n为偶数时,每n &=n – 1;操作使n的二进制最低非0位为0,等n最高位为0时再来一次n &=n – 1;时,n就变为0了。
int bit(int n) { int all = 0; while(n){ ++all; n &= n – 1; } return all; }
若n为9999,则bit函数的返回值为多少。
答案:8。
二级指针作为函数参数,作为改变传进指针内容之用。
void second_pointer(char **ppStr) { * ppStr = “hello world”; } int main(void) { char *pStr = “no hello world”; second(&pStr); printf(“%s\n”, pStr); }
答案:hello world
编译器是不允许返回局部指针的。堆内存和栈内存可否返回可以看这两篇笔记:C指针和堆空间 笔记和C语言 子函数return(局部变量&栈地址)机制 笔记。
char *return_str() { char pStr[] =”hello wordl”; // Not the char *pStr= =”hello wordl”; return pStr; } int main(void) { char *pStr = NULL; pStr = return_str(); printf(“%s\n”, pStr); }
答案:乱码。局部地址PStr可以返回,但返回后pStr所指的栈内存已经被系统释放。编译器会对此作出警告。
void translate() { int value=0x12345678; char ch = (char)value; char *ch1 = (char *)&value; char *ch2 = (char *)value; printf(“%x,%x, %x\n”, ch, *ch1, ch2); }答案:78,78,12345678
#include <stdio.h> void switch_case(int n); int main(void) { int i; for(i = 0; i < 3; ++i){ switch_case(i); } printf("\n"); return 0; }
void switch_case(int n) { switch(n){ case 0: n += 1; case 1: case 2: n += 2; default: n += 3; } printf("%d ", n); }答案:6 6 7