C語言問題集錦

[參考來源:http://www.csdn.net/article/2012-09-06/2809604-12-c-interview-questions]

1、gets()函數:
函數gets()從stdin接收一個字符串而不檢查它所複製的緩存的容積,這可能會導致緩存溢出,推薦使用標準函數fgets()代替。

2、換行:
window操作系統下的換行爲'\r\n',linux和unix操作系統下爲'\n'

3、strcpy()函數:
使用strcpy()的時候一定要檢查接收變量的容量是否足夠,推薦使用strncpy()或memcpy()。

4、main()函數返回值:
main()的返回類型應該是“int”而不是“void”,因爲“int”返回類型會讓程序返回狀態值。這點非常重要,特別當程序是作爲依賴於程序成功運行的腳本的一部分運行時。

5、內存泄露:
在程序模塊中動態申請內存時,用完的時候必須馬上釋放,雖然改程序結束時會自動釋放,但如果申請內存是在while語句中,則會造成嚴重的內存泄露。

6、free出錯:
指針的值在程序中被修改,導致傳給free()的地址出錯,也就導致了seg-fault或者崩潰。

7、atexit()函數:
如果使用atexit()就應當使用exit()或者“return”與之相配合,而不應該用_exit()函數

8、能接受任何類型的參數並返回interger(整數)結果的函數:
int func(void *ptr)

9、運算符:
“++”和“*”的優先權一樣,所以“*ptr++”相當於“*(ptr++)”。即應該先執行ptr++,然後纔是*ptr

10、排錯:
char *ptr = "Linux";   *ptr = 'T';
通過*ptr = ‘T’,會改變內存中代碼段(只讀代碼)“Linux”的第一個字母。這個操作是無效的,因此會造成seg-fault或者崩潰。

11、會改變自己名字的進程:
#include<stdio.h>                       
                                                            
int main(int argc, char *argv[])        
{                                       
    int i = 0;                          
    char buff[100];                     
                                        
    memset(buff,0,sizeof(buff));        
                                         
    strncpy(buff, argv[0], sizeof(buff));
    memset(argv[0],0,strlen(buff));     
                                         
    strncpy(argv[0], "NewName", 7);     
                                        
    // Simulate a wait. Check the process
    // name at this point.              
    for(;i<0xffffffff;i++);             
                                        
   return 0;                            
}                                       

12、返回本地變量的地址:
#include<stdio.h>                                           
                                                            
int* inc(int val)                                            
{                                                            
  int a = val;                                              
  a++;                                                      
  return &a;                                               
}                                                            
                                                            
int main(void)                                              
{                                                           
    int a = 10;                                             
    int *val = inc(a);                                      
    printf("\n Incremented value is equal to [%d] \n", *val);
                                                            
    return 0;                                               
}                                                            
儘管上面的程序有時候能夠正常運行,但是在“inc()”中存在嚴重的漏洞。這個函數返回本地變量的地址。因爲本地變量的生命週期就是“inc()”的生命週期,所以在inc結束後,使用本地變量會發生不好的結果。這可以通過將main()中變量“a”的地址來避免,這樣以後還可以修改這個地址存儲的值。
printf函數:

 

13、C語言裏函數的參數默認是從右往左處理的,輸出時是從左往右。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章