- 相關(guān)推薦
12個(gè)常見(jiàn)C語(yǔ)言面試題及答案(3)
printf("\n [%c] \n",*ptr);
return 0; }
答:輸出結(jié)果應(yīng)該是這樣:
[L] [i]
因?yàn)椤?+”和“*”的優(yōu)先權(quán)一樣,所以“*ptr++”相當(dāng)于“*(ptr++)”。即應(yīng)該先執(zhí)行ptr++,然后才是*ptr,所以操作結(jié)果是“L”。第二個(gè)結(jié)果是“i”。
9.問(wèn):修改代碼片段(或者只讀代碼)
問(wèn):下面的代碼段有錯(cuò),你能指出來(lái)嗎?
#include int main(void) {
char *ptr = "Linux";
*ptr = 'T';
printf("\n [%s] \n", ptr);
return 0; }
答:這是因?yàn),通過(guò)*ptr = ‘T’,會(huì)改變內(nèi)存中代碼段(只讀代碼)“Linux”的第一個(gè)字母。這個(gè)操作是無(wú)效的,因此會(huì)造成seg-fault或者崩潰。
10.會(huì)改變自己名字的進(jìn)程
問(wèn):你能寫(xiě)出一個(gè)在運(yùn)行時(shí)改變自己進(jìn)程名的程序嗎?
答:參見(jiàn)下面這段代碼:
#include 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; }
11.返回本地變量的地址
問(wèn):下面代碼有問(wèn)題嗎?如果有,該怎么修改?
#include 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; }
答:盡管上面的程序有時(shí)候能夠正常運(yùn)行,但是在“inc()”中存在嚴(yán)重的漏洞。這個(gè)函數(shù)返回本地變量的地址。因?yàn)楸镜刈兞康纳芷诰褪恰癷nc()”的生命周期,所以在inc結(jié)束后,使用本地變量會(huì)發(fā)生不好的結(jié)果。這可以通過(guò)將main()中變量“a”的地址來(lái)避免,這樣以后還可以修改這個(gè)地址存儲(chǔ)的值。
12.處理printf()的參數(shù)
問(wèn):下面代碼會(huì)輸出什么?
#include int main(void) {
int a = 10, b = 20, c = 30;
printf("\n %d..%d..%d \n", a+b+c, (b = b*2), (c = c*2));
return 0; }
答:輸出結(jié)果是:
110..40..60
這是因?yàn)镃語(yǔ)言里函數(shù)的參數(shù)默認(rèn)是從右往左處理的,輸出時(shí)是從左往右。
【12個(gè)常見(jiàn)C語(yǔ)言面試題及答案(3)】相關(guān)文章:
java面試題及答案10-03
計(jì)算機(jī)二級(jí)c語(yǔ)言考試習(xí)題及答案07-03
名校英語(yǔ)面試經(jīng)典常見(jiàn)的面試題10-21
計(jì)算機(jī)二級(jí)C語(yǔ)言考試選擇題(帶答案)(3)10-23
3月計(jì)算機(jī)二級(jí)C語(yǔ)言真題及答案(完整版)08-26
c語(yǔ)言實(shí)習(xí)總結(jié)06-30
c語(yǔ)言讀書(shū)筆記09-28