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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章