C語言面試常見試題10道_第1頁
C語言面試常見試題10道_第2頁
C語言面試常見試題10道_第3頁
C語言面試常見試題10道_第4頁
C語言面試常見試題10道_第5頁
已閱讀5頁,還剩2頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、C語言面試常見試題10道1strcpy()函數問:下面是一個簡單的密碼保護功能,你能在不知道密碼的情況下將其破解嗎?#include int main(int argc, char *argv) int flag = 0;char passwd10;memset(passwd,0,sizeof(passwd);strcpy(passwd, argv1);if(0 = strcmp(LinuxGeek, passwd)flag = 1;if(flag)printf(n Password cracked n);elseprintf(n Incorrect passwd n);return 0; 答

2、:破解上述加密的關鍵在于利用攻破strcpy()函數的漏洞。所以用戶在向“passwd”緩存輸入隨機密碼的時候并沒有提前檢查“passwd”的容量是否足夠。所以,如果用戶輸入一個足夠造成緩存溢出并且重寫“flag”變量默認值所存在位置的內存的長“密碼”,即使這個密碼無法通過驗證,flag驗證位也變成了非零,也就可以獲得被保護的數據了。例如:$ ./psswd aaaaaaaaaaaaaPassword cracked雖然上面的密碼并不正確,但我們仍然可以通過緩存溢出繞開密碼安全保護。要避免這樣的問題,建議使用 strncpy()函數。作者注:最近的編譯器會在內部檢測棧溢出的可能,所以這樣往棧里

3、存儲變量很難出現棧溢出。在我的gcc里默認就是這樣,所以我不得不使用編譯命令-fno-stack-protector來實現上述方案。2gets()函數問:請找出下面代碼里的問題:#include int main(void) char buff10;memset(buff,0,sizeof(buff);gets(buff);printf(n The buffer entered is %sn,buff);return 0; 答:上面代碼里的問題在于函數gets()的使用,這個函數從stdin接收一個字符串而不檢查它所復制的緩存的容積,這可能會導致緩存溢出。這里推薦使用標準函數fgets()代替

4、。3內存泄露問:下面的代碼會導致內存泄漏嗎?#include void main(void) char *ptr = (char*)malloc(10);if(NULL = ptr)printf(n Malloc failed n);return;else/ Do some processing return; 答:盡管上面的代碼并沒有釋放分配給“ptr”的內存,但并不會在程序退出后導致內存泄漏。在程序結束后,所有這個程序分配的內存都會自動被處理掉。但如果上面的代碼處于一個“while循環”中,那將會導致嚴重的內存泄漏問題!提示:如果你想知道更多關于內存泄漏的知識和內存泄漏檢測工具,可以來看看

5、我們在Valgrind上的文章。4main()的返回類型問:下面的.代碼能 編譯通過嗎?如果能,它有什么潛在的問題嗎?#include void main(void) char *ptr = (char*)malloc(10);if(NULL = ptr)printf(n Malloc failed n);return;else/ Do some processing free(ptr);return; 答:因為main()方法的返回類型,這段代碼的錯誤在大多數編譯器里會被當作警告。main()的返回類型應該是“int”而不是“void”。因為“int”返回類型會讓程序返回狀態值。這點非常重要

6、,特別當程序是作為依賴于程序成功運行的腳本的一部分運行時。5使用_exit退出問:在下面的代碼中,atexit()并沒有被調用,為什么?#include void func(void) printf(n Cleanup function called n);return; int main(void) int i = 0;atexit(func);for(;i0xffffff;i+);_exit(0); 這是因為_exit()函數的使用,該函數并沒有調用atexit()等函數清理。如果使用atexit()就應當使用exit()或者“return”與之相配合。6free()函數問:下面的程序會在

7、用戶輸入freeze的時候出問題,而zebra則不會,為什么?#include int main(int argc, char *argv) char *ptr = (char*)malloc(10);if(NULL = ptr)printf(n Malloc failed n);return -1;else if(argc = 1)printf(n Usage n);elsememset(ptr, 0, 10);strncpy(ptr, argv1, 9);while(*ptr != z)if(*ptr = )break;elseptr+;if(*ptr = z)printf(n Strin

8、g contains zn);/ Do some more processing free(ptr);return 0; 答:這里的問題在于,代碼會(通過增加“ptr”)修改while循環里“ptr”存儲的地址。當輸入“zebra”時,while循環會在執行前被終止,因此傳給free()的變量就是傳給malloc()的地址。但在“freeze”時,“ptr”存儲的地址會在while循環里被修改,因此導致傳給free()的地址出錯,也就導致了seg-fault或者崩潰。7*和+操作問:下面的操作會輸出什么?為什么?#include int main(void) char *ptr = Linux

9、;printf(n %c n,*ptr+);printf(n %c n,*ptr);return 0; 答:輸出結果應該是這樣:L i因為“+”和“*”的優先權一樣,所以“*ptr+”相當于“*(ptr+)”。即應該先執行ptr+,然后才是*ptr,所以操作結果是“L”。第二個結果是“i”。8void*和C結構體問:你能設計一個能接受任何類型的參數并返回interger(整數)結果的函數嗎?答:如下:int func(void *ptr)如果這個函數的參數超過一個,那么這個函數應該由一個結構體來調用,這個結構體可以由需要傳遞參數來填充。9會改變自己名字的進程問:你能寫出一個在運行時改變自己進程

10、名的程序嗎?答:參見下面這段代碼:#include int main(int argc, char *argv) int i = 0;char buff100;memset(buff,0,sizeof(buff);strncpy(buff, argv0, sizeof(buff);memset(argv0,0,strlen(buff);strncpy(argv0, NewName, 7);/ Simulate a wait. Check the process / name at this point. for(;i0xffffffff;i+);return 0; 10:修改代碼片段(或者只讀代碼)問:下面的代碼段有錯,你能指出來

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論