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