暑假时学校研电赛召开的招聘会,当时投了8,9家公司,收到面试邀请两家,一家江苏苏美达(由于当时在实习就没去),一家今天这家。
今天面博流智能科技,内心倍遭打击,特此记录,引以为戒。
约的3点,早到了一个钟头,失误了,结果下午精神没有达到最佳状态。
抵达孵鹰大厦,先做一套笔试题,笔试题一共4题:
1、比较简单,但是自己犯了一个错误,一会面试官给我检查时指出
void func(int a[4])
{
printf("%d",sizeof(a)); 4,这里我有答出是4;
}
char *s = "hello world!",
printf("%d",sizeof(s)); 这里我竟然写13,真是蠢到没朋友
char *ptr;
ptr = malloc(1204);
printf("%d",sizepf(ptr)); 这里我竟然写1024,真是活该我单身
2、也比较简单,但自己仍犯弱智型错误
主要考变量和数据的内存分布,这个我明明总结过得,却还是总结的不到位
char *ptr;
ptr = malloc(1024); ptr是存在栈上的,1024是存在堆上的,我竟然。。。
还有问我RW区和ZI区,直接懵逼。。。。。。没见过这两个区啊,回来后查资料才知道只是不知道它的英文缩写是这个。。。。。就是全局区的初始化区和未初始化区,附资料如下:
如上图,Code是程序代码所占的字节,即代码区;
RO-data 代表只读数据,程序中所定义的常量数据和字符串等都位于此处,即常量区;
RW-data 代表已初始化的读写数据,程序中定义并且初始化的全局变量和静态变量位于此处,一部分静态区(全局区);
ZI-data 代表未初始化的读写数据,程序中定义了但没有初始化的全局变量和静态变量位于此处,另一部分的静态区(全局区)。ZI英语是zero initial,就是程序中用到的变量并且被系统初始化为0的变量的字节数,keil编译器默认是把你没有初始化的变量都赋值一个0,这些变量在程序运行时是保存在RAM中的。
Total ROM Size (Code + RO Data + RW Data)这样所写的程序占用的ROM的字节总数,也就是说程序所下载到ROM flash 中的大小。
为什么Rom中还要存RW,因为掉电后RAM中所有数据都丢失了,每次上电RAM中的数据是被重新赋值的,每次这些固定的值就是存储在Rom中的,为什么不包含ZI段呢,是因为ZI数据都是0,没必要包含,只要程序运行之前将ZI数据所在的区域一律清零即可,包含进去反而浪费存储空间。
实际上,ROM中的指令至少应该有这样的功能:
1. 将RW从ROM中搬到RAM中,因为RW是变量,变量不能存在ROM中。
2. 将ZI所在的RAM区域全部清零,因为ZI区域并不在Image中,所以需要程序根据编译器给出的ZI地址及大小来将相应得RAM区域清零。ZI中也是变量,同理:变量不能存在ROM中。
在程序运行的最初阶段,RO中的指令完成了这两项工作后C程序才能正常访问变量。否则只能运行不含变量的代码。
然后又问了我一个我现在还是不理解的问题:
全局变量
int a = 2;
面试官:这个2存在哪里?
我:不是在常量区吗?
面试官:怎么把它给a 的?
我:。。。。。。
面试官:是在编译运行那个阶段怎么给a的?你可以写一个接口取到这个值吗?
我:。。。。。。
3、第三题是编程填空,我又没做对(我他吗怎么可以这么菜)
具体题目默不下来了,反正是给你一个结构体
struct Node
{
int32 a;
int32 b;
int8 c;
};
struct Node * L;
现在有一个指针ptr指向c的值,让你求结构体的指针。
我的意思的ptr这个地址值左移64位,即可求结构体的指针地址值,结果我写成了 ptr >>= 64;
我真是,这是把ptr的地址值扩大2的64次方倍,
应该写成 (char *)ptr -= 64;
唉,后面我还给面试官吹我读过C和指针。。。。。。。也是心大。
4、第四题是一道大题,分析题,大概意思就是从键盘打开Chrome输入www.baidu.com到浏览器弹出网页你所知道的技术有哪些?
。。。。。。
我。。。。。。。强答了一波键盘的防抖技术松手检测,tcp/ip的四层网络结构
面试:
实习那部分答得也还行,聊天室部分又是整段垮掉。。。。。。
唉!我好难啊