[參考來源: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語言裏函數的參數默認是從右往左處理的,輸出時是從左往右。