- 相關(guān)推薦
12個(gè)常見C語言面試題及答案(2)
if(NULL == ptr)
{
printf("\n Malloc failed \n");
return;
}
else
{
// Do some processing }
return; }
答:盡管上面的代碼并沒有釋放分配給“ptr”的內(nèi)存,但并不會(huì)在程序退出后導(dǎo)致內(nèi)存泄漏。在程序結(jié)束后,所有這個(gè)程序分配的內(nèi)存都會(huì)自動(dòng)被處理掉。但如果上面的代碼處于一個(gè)“while循環(huán)”中,那將會(huì)導(dǎo)致嚴(yán)重的內(nèi)存泄漏問題!
提示:如果你想知道更多關(guān)于內(nèi)存泄漏的知識(shí)和內(nèi)存泄漏檢測(cè)工具,可以來看看我們?cè)赩algrind上的文章。
5.free()函數(shù)
問:下面的程序會(huì)在用戶輸入’freeze’的時(shí)候出問題,而’zebra’則不會(huì),為什么?
#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");
}
else
{
memset(ptr, 0, 10);
strncpy(ptr, argv[1], 9);
while(*ptr != 'z')
{
if(*ptr == '')
break;
else
ptr++;
}
if(*ptr == 'z')
{
printf("\n String contains 'z'\n");
// Do some more processing }
free(ptr);
}
return 0; }
答:這里的問題在于,代碼會(huì)(通過增加“ptr”)修改while循環(huán)里“ptr”存儲(chǔ)的地址。當(dāng)輸入“zebra”時(shí),while循環(huán)會(huì)在執(zhí)行前被終止,因此傳給free()的變量就是傳給malloc()的地址。但在“freeze”時(shí),“ptr”存儲(chǔ)的地址會(huì)在while循環(huán)里被修改,因此導(dǎo)致傳給free()的地址出錯(cuò),也就導(dǎo)致了seg-fault或者崩潰。
6.使用_exit退出
問:在下面的代碼中,atexit()并沒有被調(diào)用,為什么?
#include void func(void) {
printf("\n Cleanup function called \n");
return; } int main(void) {
int i = 0;
atexit(func);
for(;i<0xffffff;i++);
_exit(0); }
這是因?yàn)開exit()函數(shù)的使用,該函數(shù)并沒有調(diào)用atexit()等函數(shù)清理。如果使用atexit()就應(yīng)當(dāng)使用exit()或者“return”與之相配合。
7.void*和C結(jié)構(gòu)體
問:你能設(shè)計(jì)一個(gè)能接受任何類型的參數(shù)并返回interger(整數(shù))結(jié)果的函數(shù)嗎?
答:如下:
int func(void *ptr)
如果這個(gè)函數(shù)的參數(shù)超過一個(gè),那么這個(gè)函數(shù)應(yīng)該由一個(gè)結(jié)構(gòu)體來調(diào)用,這個(gè)結(jié)構(gòu)體可以由需要傳遞參數(shù)來填充。
8.*和++操作
問:下面的操作會(huì)輸出什么?為什么?
#include int main(void) {
char *ptr = "Linux";
printf("\n [%c] \n",*ptr++);
【12個(gè)常見C語言面試題及答案(2)】相關(guān)文章:
計(jì)算機(jī)二級(jí)C語言考試選擇題(帶答案)(2)06-10
java面試題及答案10-03
計(jì)算機(jī)二級(jí)c語言考試習(xí)題及答案07-03
名校英語面試經(jīng)典常見的面試題10-21
經(jīng)典常見面試題分析解答08-14
職稱英語衛(wèi)生類C級(jí)真題及答案(word版)(2)06-10
c語言讀書筆記09-28