国产激情久久久久影院小草_国产91高跟丝袜_99精品视频99_三级真人片在线观看

c語言面試題

時間:2022-10-14 18:37:47 面試問題 我要投稿
  • 相關推薦

c語言面試題

1.gets()函數(shù)

c語言面試題

問:請找出下面代碼里的問題:

  1. #include<stdio.h> 
  2. int main(void
  3.     char buff[10]; 
  4.     memset(buff,0,sizeof(buff)); 
  5.  
  6.     gets(buff); 
  7.  
  8.     printf("\n The buffer entered is [%s]\n",buff); 
  9.  
  10.     return 0; 

答:上面代碼里的問題在于函數(shù)gets()的使用,這個函數(shù)從stdin接收一個字符串而不檢查它所復制的緩存的容積,這可能會導致緩存溢出。這里推薦使用標準函數(shù)fgets()代替。

2.strcpy()函數(shù)

問:下面是一個簡單的密碼保護功能,你能在不知道密碼的情況下將其破解嗎?

  1. #include<stdio.h> 
  2.  
  3. int main(int argc, char *argv[]) 
  4.     int flag = 0; 
  5.     char passwd[10]; 
  6.  
  7.     memset(passwd,0,sizeof(passwd)); 
  8.  
  9.     strcpy(passwd, argv[1]); 
  10.  
  11.     if(0 == strcmp("LinuxGeek", passwd)) 
  12.     { 
  13.         flag = 1; 
  14.     } 
  15.  
  16.     if(flag) 
  17.     { 
  18.         printf("\n Password cracked \n"); 
  19.     } 
  20.     else 
  21.     { 
  22.         printf("\n Incorrect passwd \n"); 
  23.  
  24.     } 
  25.     return 0; 

答:破解上述加密的關鍵在于利用攻破strcpy()函數(shù)的漏洞。所以用戶在向“passwd”緩存輸入隨機密碼的時候并沒有提前檢查 “passwd”的容量是否足夠。所以,如果用戶輸入一個足夠造成緩存溢出并且重寫“flag”變量默認值所存在位置的內存的長“密碼”,即使這個密碼無法通過驗證,flag驗證位也變成了非零,也就可以獲得被保護的數(shù)據(jù)了。例如:

  1. $ ./psswd aaaaaaaaaaaaa 
  2.  
  3. Password cracked 

雖然上面的密碼并不正確,但我們仍然可以通過緩存溢出繞開密碼安全保護。

要避免這樣的問題,建議使用 strncpy()函數(shù)。

作者注:最近的編譯器會在內部檢測棧溢出的可能,所以這樣往棧里存儲變量很難出現(xiàn)棧溢出。在我的gcc里默認就是這樣,所以我不得不使用編譯命令‘-fno-stack-protector’來實現(xiàn)上述方案。

3.main()的返回類型

問:下面的代碼能 編譯通過嗎?如果能,它有什么潛在的問題嗎?

  1. #include<stdio.h> 
  2.  
  3. void main(void
  4.     char *ptr = (char*)malloc(10); 
  5.  
  6.     if(NULL == ptr) 
  7.     { 
  8.         printf("\n Malloc failed \n"); 
  9.         return
  10.     } 
  11.     else 
  12.     { 
  13.         // Do some processing 
  14.         free(ptr); 
  15.     } 
  16.  
  17.     return

答:因為main()方法的返回類型,這段代碼的錯誤在大多數(shù)編譯器里會被當作警告。main()的返回類型應該是“int”而不是“void”。因為“int”返回類型會讓程序返回狀態(tài)值。這點非常重要,特別當程序是作為依賴于程序成功運行的腳本的一部分運行時。

4.內存泄露

問:下面的代碼會導致內存泄漏嗎?

  1. #include<stdio.h> 
  2.  
  3. void main(void
  4.     char *ptr = (char*)malloc(10); 
  5.  
  6.     if(NULL == ptr) 
  7.     { 
  8.         printf("\n Malloc failed \n"); 
  9.         return
  10.     } 
  11.     else 
  12.     { 
  13.         // Do some processing 
  14.     } 
  15.  
  16.     return

答:盡管上面的代碼并沒有釋放分配給“ptr”的內存,但并不會在程序退出后導致內存泄漏。在程序結束后,所有這個程序分配的內存都會自動被處理掉。但如果上面的代碼處于一個“while循環(huán)”中,那將會導致嚴重的內存泄漏問題!

提示:如果你想知道更多關于內存泄漏的知識和內存泄漏檢測工具,可以來看看我們在Valgrind上的文章。

5.free()函數(shù)

問:下面的程序會在用戶輸入'freeze'的時候出問題,而'zebra'則不會,為什么?

  1. #include<stdio.h> 
  2.  
  3. int main(int argc, char *argv[]) 
  4.     char *ptr = (char*)malloc(10); 
  5.  
  6.     if(NULL == ptr) 
  7.     { 
  8.         printf("\n Malloc failed \n"); 
  9.         return -1; 
  10.     } 
  11.     else if(argc == 1) 
  12.     { 
  13.         printf("\n Usage  \n"); 
  14.     } 
  15.     else 
  16.     { 
  17.         memset(ptr, 0, 10); 
  18.  
  19.         strncpy(ptr, argv[1], 9); 
  20.  
  21.         while(*ptr != 'z'
  22.         { 
  23.             if(*ptr == ''
  24.                 break
  25.             else 
  26.                 ptr++; 
  27.         } 
  28.  
  29.         if(*ptr == 'z'
  30.         { 
  31.             printf("\n String contains 'z'\n"); 
  32.             // Do some more processing 
  33.         } 
  34.  
  35.        free(ptr); 
  36.     } 
  37.  
  38.     return 0; 

答:這里的問題在于,代碼會(通過增加“ptr”)修改while循環(huán)里“ptr”存儲的地址。當輸入“zebra”時,while循環(huán)會在執(zhí)行前被終止,因此傳給free()的變量就是傳給malloc()的地址。但在“freeze”時,“ptr”存儲的地址會在while循環(huán)里被修改,因此導致傳給free()的地址出錯,也就導致了seg-fault或者崩潰。

6.使用_exit退出

問:在下面的代碼中,atexit()并沒有被調用,為什么?

  1. #include<stdio.h> 
  2.  
  3. void func(void
  4.     printf("\n Cleanup function called \n"); 
  5.     return
  6.  
  7. int main(void
  8.     int i = 0; 
  9.  
  10.     atexit(func); 
  11.  
  12.     for(;i<0xffffff;i++); 
  13.  
  14.     _exit(0); 

這是因為_exit()函數(shù)的使用,該函數(shù)并沒有調用atexit()等函數(shù)清理。如果使用atexit()就應當使用exit()或者“return”與之相配合。

7. 寫一個“標準”宏MIN,這個宏輸入兩個參數(shù)并返回較小的一個。
#define MIN(A,B) ((A) <= (B) (A) : ))

這個測試是為下面的目的而設的:

1). 標識#define在宏中應用的基本知識。這是很重要的,因為直到嵌入(inline)操作符變?yōu)闃藴蔆的一部分,宏是方便產生嵌入代碼的唯一方法,對于嵌入式系統(tǒng)來說,為了能達到要求的性能,嵌入代碼經常是必須的方法。 2). 三重條件操作符的知識。這個操作符存在C語言中的原因是它使得編譯器能產生比if-then-else更優(yōu)化的代碼,了解這個用法是很重要的。 3). 懂得在宏中小心地把參數(shù)用括號括起來 4). 我也用這個問題開始討論宏的副作用,例如:當你寫下面的代碼時會發(fā)生什么事? least = MIN(*p++, b);

8. 嵌入式系統(tǒng)中經常要用到無限循環(huán),你怎么樣用C編寫死循環(huán)呢?

這個問題用幾個解決方案。我首選的方案是: while(1) { } 一些程序員更喜歡如下方案: for(;;) { } 這個實現(xiàn)方式讓我為難,因為這個語法沒有確切表達到底怎么回事。如果一個應試者給出這個作為方案,我將用這個作為一個機會去探究他們這樣做的 基本原理。如果他們的基本答案是:“我被教著這樣做,但從沒有想到過為什么。”這會給我留下一個壞印象。 第三個方案是用 goto Loop: ... goto Loop; 應試者如給出上面的方案,這說明或者他是一個匯編語言程序員(這也許是好事)或者他是一個想進入新領域的BASIC/FORTRAN程序員。

9. 嵌入式系統(tǒng)總是要用戶對變量或寄存器進行位操作。給定一個整型變量a,寫兩段代碼,第一個設置a的bit 3,第二個清除a 的bit 3。在以上兩個操作中,要保持其它位不變。

對這個問題有三種基本的反應 1). 不知道如何下手。該被面者從沒做過任何嵌入式系統(tǒng)的工作。 2). 用bit fields。Bit fields是被扔到C語言死角的東西,它保證你的代碼在不同編譯器之間是不可移植的,同時也保證了的你的代碼是不可重用的。我最近不幸看到 Infineon為其較復雜的通信芯片寫的驅動程序,它用到了bit fields因此完全對我無用,因為我的編譯器用其它的方式來實現(xiàn)bit fields的。從道德講:永遠不要讓一個非嵌入式的家伙粘實際硬件的邊。 3). 用 #defines 和 bit masks 操作。這是一個有極高可移植性的方法,是應該被用到的方法。最佳的解決方案如下: #define BIT3 (0x1<<3) static int a; void set_bit3(void) { a |= BIT3; } void clear_bit3(void) { a &= ~BIT3; } 一些人喜歡為設置和清除值而定義一個掩碼同時定義一些說明常數(shù),這也是可以接受的。我希望看到幾個要點:說明常數(shù)、|=和&=~操作。

10. 嵌入式系統(tǒng)經常具有要求程序員去訪問某特定的內存位置的特點。在某工程中,要求設置一絕對地址為0x67a9的整型變量的值為0xaa66。編譯器是一個純粹的ANSI編譯器。寫代碼去完成這一任務。

這一問題測試你是否知道為了訪問一絕對地址把一個整型數(shù)強制轉換(typecast)為一指針是合法的。這一問題的實現(xiàn)方式隨著個人風格不同而不同。典型的類似代碼如下: int *ptr; ptr = (int *)0x67a9; *ptr = 0xaa55;

一個較晦澀的方法是: *(int * const)(0x67a9) = 0xaa55;

即使你的品味更接近第二種方案,但我建議你在面試時使用第一種方案。

【c語言面試題】相關文章:

c語言心得05-17

c語言的就業(yè)方向08-11

基礎C++/C語言筆試題分享11-21

華為C語言筆試題12-12

華為筆試題(C語言)12-10

c語言實習心得09-01

C語言實訓心得12-01

C語言實習心得01-01

C語言的論文致謝詞11-25

C++語言的基本符號10-11