感觉自己答的普普通通,通过这次面试发现自己在基础上的不足。自己学习了一下当时有些迷糊的知识点,整理如下:
迷糊点1:
char str[] = “hello!” ;
char *p = str ;
请写出下面输出的结果
printf("%d\n",sizeof (str ) );
printf("%d\n",sizeof ( p );
对于sizeof(),在对数组名进行操作时,返回的大小为数组所占用的内存大小,而对指向数组的指针进行操作时,返回的大小为指针的大小(自己对指针返回的大小很犹豫,现在记住了,从这里也可以看出,数组名并不是完全等同于指针)
关于上面的问题,自己学了数组名和指针的区别。(1)在本质上,数组名其实指代一种数据结构,这个数据结构就是数组的全体(2)数组名可以转换为指向其指代实体的指针,而且是一个指针常量!(3)和数组名不同,指向数组的指针则是另外一种变量类型,它用于存放数组的地址(4)如果数组名作函数行参时,在函数体内它就失去了本身的数据机构特性,仅仅只是一个指向改数组的指针
而且通过这个问题,自己查找了一下有关sizeof,发现自己一直以为它是一个函数,而它实质上是一个操作符(从sizeof(int)上就可以看出,因为函数接纳的形参不能是一个int的类型数据)
下面是辨析的几个例子:
Test 1:
char str[10];
char *pStr = str;
cout << sizeof(str) << endl; //10(此时数组名表现为前面的性质(1))
cout << sizeof(pStr) << endl; //4(在32位系统下)
Test 2:
char str1[10] = "hello";
char str2[10];
strcpy(str2,str1); //此时数组名表现为前面的性质(2)
Test 3:
void arrayTest(char str[])
{
cout << sizeof(str) << endl;
}
char str1[10] = "hello";
arrayTest(str1); //此时数组名表现为前面的性质(4)
迷糊点2
fork();printf("#");
fork();printf("#");
当时自己回答的是6,结果电脑测出来是8。记得之前学到的子进程从fork()后开始执行,百思不得其解。。然后百度了一下,不得不说自己确实欠缺好多~
从网上整理了一下思路,大概就是说这是由printf的缓冲机制 + 进程间的继承机制造成的。因为操作系统只是把printf的内容放到了stdout缓冲队列里,并没有实际写到屏幕上。而再运行到fork时,缓冲里面的内容被子进程继承了,所以最后这4个进程一共输出了8次
但是只要系统看到\n就会立刻刷新stdout,或者我们用fflush()函数强制刷新缓冲区这两种方式,就会输出6个#
具体辨析:
Test 1:
fork();printf("#");
fflush(stdout);
fork();printf("#");
//输出6个
Test 2:
fork();printf("#\n");
fork();printf("#\n");
//输出6行,每行1个
迷糊点3
由于迷糊点2的题没有答好,面试官问到关于进程间的继承问题,自己找了一个经典题理解了一下:
pid_t pid1 = fork();
pid_t pid2 = fork();
printf("pid1:%d, pid2:%d\n", pid1, pid2);
以前对于fork只停留在“新建一个进程,父进程返回一个子进程的pid,子进程返回一个0,然后系统就有两个进程,并开始向下执行内容”这个初步认识的阶段。
其实fork的新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是它是一个全新的进程并作为原进程的子进程
对于上面这个例子的有一下几个步骤:
(1)首先有一个主进程root,执行完第一个fork()创建一个进程son1,son1继承root的所有变量,环境变量,计数器等,然后更新pid1,假设此时root的pid1为1001,那么son1的pid1为0
(2)root执行完第二个fork()创建一个进程son2,son2继承root的所有变量,环境变量,计数器等,然后更新pid2,假设此时root的pid2为1002,那么son2的pid2为0,它们两个的pid1都为1001
(3)son1执行完第二个fork()创建一个进程grandson,grandson继承son1的所有变量,环境变量,计数器等,然后更新pid2,假设此时son1的pid2为1003,那么grandson的pid2为0,它们两个的pid1都为0
迷糊点4
对于编程中常用的函数参数记忆不清。加强自己的记忆力吧,面试官问到listen()函数的第二个参是什么?当时给忘了,然后越想越着急,苦笑。。事后我说起这个第二个参,同学说不是最大连接数吗。。突然惊醒,感觉自己应该结合实际好好想想,其实这些东西也都不是死记硬背的。。
最后,就是感觉到了自己的不足。自己学的东西好像是一个空中楼阁,经不起实战的打磨。继续沉下心来磨砺自己吧,把以后的重心先放在操作系统入门与系统编程上。凡事都要讲求一个透彻明白吧。。。。
如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢