下午在牛客網上試做了一下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的值就是數組末尾的位置了。