下午在牛客网上试做了一下2015校招研发岗位的笔试题,错了蛮多的,这里总结一些题目吧。
1、不算main这个进程,到底创建了多少个进程?
int main(int argc, char* argv[])
{
fork();
fork() && fork() || fork();
fork();
}
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的值就是数组末尾的位置了。