C/C++在线笔试题总结(持续更新)

下午在牛客网上试做了一下2015校招研发岗位的笔试题,错了蛮多的,这里总结一些题目吧。


1、不算main这个进程,到底创建了多少个进程?


int main(int argc, char* argv[])
{
   fork();
   fork() && fork() || fork();
   fork();
}

解析:主要考虑到两点:第一,对于fork()函数,在父进程中返回子进程ID,在子进程中返回0;第二:短路求值。


注释:图中虚线为进程自己,实线为进程创建的子进程,括号里为返回值。

如图,在进行第三个fork的时候,有个短路求值,如果fork3的结果是0,则与操作的结果肯定是0,也就是说fork4就直接跳过不执行了。例如,f在进行fork2的时候,创建的子进程c2,在c2中的返回值为0,则c2进程直接跳过fork4了。最后结果就是除了main主进程f之外,一共创建了19个进程。


2、在Linux下64为c程序,请计算输出的三个sizeof分别是?

void func(char str_arg[100])
{
     cout<<sizeof(str_arg)<<endl;
}
int main(int argc,char* argv[])
{
     char str[]="Hello";
     char *p=str;
     cout<<sizeof(str)<<endl;
     cout<<sizeof(p)<<endl;
     func("test");
     return 0;
}


这一题主要考察的有几点:

<1>  C风格的字符串末尾总是以一个'\0'作为结尾。因此,存储字符串"hello"的内存大小为6个,而不是5个。

<2>  数组名的实质是一个指针常量,但是有两种场合下并不用指针常量来表示。第一种场合是作为sizeof操作符的操作数时,此时sizeof操作符所获取的内存空间大小是整个数组而非单个指针常量所占内存大小;第二种场合是作为单目操作符&的操作数时,获取的地址并不是一个指向指针的地址,而是一个指向数组的地址。因此,这里的sizeof(str)的值应该是数组的大小,即为6。


<3>  64位系统下指针占用的长度是8byte,因此sizeof(p)的值为8。


<4>  当用非引用数组名作为函数参数时,编译器将其视为一个普通指针,中括号中的数组大小是无意义的。因此,sizeof(str_arg)的大小即为指针占用长度8byte。


3、下面的代码会输出什么?

int main(int argc,char**argv){
    int a[4]={1,2,3,4};
    int*ptr=(int*)(&a+1);
    printf(“&d”,*(ptr-1));
}

这一题主要的点是数组指针。首先我们声明一个数组指针int (*ptr)[10]。这里的括号是必须的,因为下标操作符[]的优先级要高于*。我们可以从表面上来记忆,(*ptr)为一个数组,即ptr指向的内容是一个数组,即ptr是一个指向数组的指针。因此,如果在ptr的基础上进行算数运算,单位1的长度就是整个数组类型的长度了。题中,&a为指向数组a[4]的指针,则&a + 1的值为整个数组末尾的下一位置。然后将这个指针显式强制转换为int*型,然后ptr - 1的值就是数组末尾的位置了。
发布了68 篇原创文章 · 获赞 42 · 访问量 22万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章