華為的(de)嵌入式(shi)工程師面試(shi)題(有(you)答(da)案)
時間:2015-09-21 來源(yuan):未知
有答案(an)的面(mian)試(shi)題,雖然不適合自我測試(shi),但是(shi)看看也無妨,畢竟(jing)對即將要面(mian)試(shi)同學而言,百(bai)益而無一(yi)害。如下(xia):
(1)什(shen)么是(shi)預(yu)編(bian)譯(yi),何時需(xu)要預(yu)編(bian)譯(yi):
答案:
1、總是使用不經常改(gai)動的大型代碼體。
2、程序(xu)由(you)多(duo)個(ge)(ge)模(mo)塊組成,所(suo)有(you)模(mo)塊都(dou)使用一組標準(zhun)的包含文件和相(xiang)同的編譯選項(xiang)。在這種情況(kuang)下,可以將(jiang)所(suo)有(you)包含文件預編譯為(wei)一個(ge)(ge)預編譯頭。
(2)char * const p char const * p const char *p 上述三個有(you)什(shen)么區別(bie)?
答案:
char * const p; //常量(liang)指針(zhen),p的值(zhi)不可(ke)以修改
char const * p;//指(zhi)(zhi)向常量的(de)指(zhi)(zhi)針,指(zhi)(zhi)向的(de)常量值(zhi)不可(ke)以改
const char *p; //和char const *p
(3)char str1[] ="abc"; char str2[] = "abc"; const char str3[] ="abc"; const char str4[] = "abc"; const char *str5 ="abc"; const char *str6 = "abc"; char *str7 ="abc"; char *str8 = "abc"; cout < < ( str1 == str2 )< < endl; cout < < ( str3 == str4 ) < < endl; cout < <( str5 == str6 ) < < endl; cout < < ( str7 == str8 ) < < p>
結果是:0 0 1 1 str1,str2,str3,str4是數組變量,它們有(you)各自的內存空間(jian);而str5,str6,str7,str8是指針,它們指向相同的常量區域(yu)。
(4)以(yi)下代碼中(zhong)的兩個(ge)sizeof用法有問題嗎?
[C易] void UpperCase( charstr[] ) // 將 str 中的小寫字母(mu)(mu)轉換(huan)成(cheng)大寫字母(mu)(mu) { for( size_t i=0; i< endl; <="str[i]" str< cout ); str UpperCase( sizeof(str[0])
(5)一個32位(wei)的機器,該機器的指針是多少位(wei)答(da)案:
指(zhi)針(zhen)是多少位(wei)只要(yao)看地址總(zong)線(xian)的位(wei)數就(jiu)行了。80386以(yi)(yi)后的機子(zi)都是32的數據總(zong)線(xian)。所以(yi)(yi)指(zhi)針(zhen)的位(wei)數就(jiu)是4個字節了。
6、main() { inta[5]={1,2,3,4,5}; int *ptr=(int*)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); }
答案:2。5 *(a+1)就(jiu)(jiu)是(shi)(shi)(shi)(shi)a[1],*(ptr-1)就(jiu)(jiu)是(shi)(shi)(shi)(shi)a[4],執行結果是(shi)(shi)(shi)(shi)2,5 &a+1不(bu)(bu)是(shi)(shi)(shi)(shi)首(shou)(shou)地(di)(di)(di)址(zhi)+1,系統會認為加一(yi)(yi)(yi)個(ge)a數(shu)(shu)組(zu)的(de)偏移(yi),是(shi)(shi)(shi)(shi)偏移(yi)了一(yi)(yi)(yi)個(ge)數(shu)(shu)組(zu)的(de)大小(本例是(shi)(shi)(shi)(shi)5個(ge)int) int *ptr=(int*)(&a+1); 則ptr實(shi)際是(shi)(shi)(shi)(shi)&(a[5]),也(ye)(ye)就(jiu)(jiu)是(shi)(shi)(shi)(shi)a+5 原因(yin)如(ru)下(xia): &a是(shi)(shi)(shi)(shi)數(shu)(shu)組(zu)指(zhi)(zhi)針(zhen),其類型(xing)(xing)為 int (*)[5]; 而指(zhi)(zhi)針(zhen)加1要(yao)(yao)根據指(zhi)(zhi)針(zhen)類型(xing)(xing)加上一(yi)(yi)(yi)定的(de)值,不(bu)(bu)同類型(xing)(xing)的(de)指(zhi)(zhi)針(zhen)+1之后增加的(de)大小不(bu)(bu)同 a是(shi)(shi)(shi)(shi)長度為5的(de)int數(shu)(shu)組(zu)指(zhi)(zhi)針(zhen),所以要(yao)(yao)加 5*sizeof(int) 所以ptr實(shi)際是(shi)(shi)(shi)(shi)a[5] 但是(shi)(shi)(shi)(shi)prt與(&a+1)類型(xing)(xing)是(shi)(shi)(shi)(shi)不(bu)(bu)一(yi)(yi)(yi)樣的(de)(這點很重要(yao)(yao)) 所以prt-1只會減去sizeof(int*) a,&a的(de)地(di)(di)(di)址(zhi)是(shi)(shi)(shi)(shi)一(yi)(yi)(yi)樣的(de),但意思不(bu)(bu)一(yi)(yi)(yi)樣,a是(shi)(shi)(shi)(shi)數(shu)(shu)組(zu)首(shou)(shou)地(di)(di)(di)址(zhi),也(ye)(ye)就(jiu)(jiu)是(shi)(shi)(shi)(shi)a[0]的(de)地(di)(di)(di)址(zhi),&a是(shi)(shi)(shi)(shi)對(dui)象(數(shu)(shu)組(zu))首(shou)(shou)地(di)(di)(di)址(zhi),a+1是(shi)(shi)(shi)(shi)數(shu)(shu)組(zu)下(xia)一(yi)(yi)(yi)元(yuan)素(su)的(de)地(di)(di)(di)址(zhi),即a[1],&a+1是(shi)(shi)(shi)(shi)下(xia)一(yi)(yi)(yi)個(ge)對(dui)象的(de)地(di)(di)(di)址(zhi),即a[5].
7、請問以(yi)下代(dai)碼有什么問題:
int main()
{
char a;
char *str=&a;
strcpy(str,"hello");
printf(str);
return 0;
}
答案:沒有(you)為str分配內存空(kong)間,將(jiang)會發生異常問題(ti)出在將(jiang)一(yi)個字符(fu)串復制進(jin)一(yi)個字符(fu)變量指針(zhen)所指地址。雖然可以(yi)正確輸出結果(guo),但因為越界進(jin)行內在讀寫而導致程序崩(beng)潰。
8、char* s="AAA"; printf("%s",s); s[0]='B';printf("%s",s); 有什么錯?
答案:"AAA"是(shi)字符(fu)串常(chang)量(liang)。s是(shi)指針,指向這個字符(fu)串常(chang)量(liang),所(suo)以聲明s的時候就(jiu)有問(wen)題。 cosnt char*s="AAA"; 然(ran)后又(you)因為是(shi)常(chang)量(liang),所(suo)以對是(shi)s[0]的賦值操作(zuo)是(shi)不合(he)法的。
9、寫(xie)一個(ge)(ge)(ge)"標準"宏,這個(ge)(ge)(ge)宏輸(shu)入兩個(ge)(ge)(ge)參數并返回較小的一個(ge)(ge)(ge)。
答案:.#define Min(X, Y)((X)>(Y)?(Y):(X)) //結(jie)尾沒有';'
10、嵌入式系統(tong)中經(jing)常要用到無限(xian)循環,你(ni)怎么用C編寫死循環。
答案:while(1){}或者for(;;)
11、關鍵字static的作用是什么?
答案:定義靜態(tai)變量
12、關(guan)鍵字const有(you)什么含意?
答(da)案:表(biao)示常量不(bu)可以修改的(de)變量。
13、關鍵字volatile有什么含(han)意?并舉(ju)出(chu)三個不同的例子(zi)?
答案(an):提示編譯(yi)器(qi)(qi)對(dui)象的值(zhi)可能(neng)在編譯(yi)器(qi)(qi)未監測到的情況下改變(bian)。
14、int(*s[10])(int) 表示的是什么啊(a)?
答(da)案:int(*s[10])(int) 函數指針(zhen)數組,每個指針(zhen)指向一個int func(int param)的(de)函數。
15、有以下(xia)表(biao)達式:
int a=248;
b=4;
int const c=21;
const int *d=&a;
int *conste=&b;
int const *f const =&a;
請問(wen)下列表達式哪些會(hui)被編(bian)譯器(qi)禁止(zhi)?為什么?
答案:*c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;*c 這是個什么東(dong)東(dong),禁(jin)止 *d 說(shuo)了是const, 禁(jin)止 e = &a 說(shuo)了是const 禁(jin)止 const *f const =&a; 禁(jin)止
16、交換(huan)兩個變量的值,不使用第(di)三(san)個變量。即(ji)a=3,b=5,交換(huan)之后a=5,b=3;
答案:有兩(liang)種(zhong)(zhong)解(jie)法(fa), 一種(zhong)(zhong)用算(suan)術算(suan)法(fa), 一種(zhong)(zhong)用^(異(yi)或) a = a + b; b = a - b; a= a - b; or a = a^b;// 只能對int,char.. b = a^b; a = a^b; or a ^= b ^= a;
17.c和c++中的struct有什么不同(tong)?
答(da)案:c和(he)c++中struct的主(zhu)要區別是c中的struct不可(ke)以含(han)有成員函數,而c++中的struct可(ke)以。c++中struct和(he)class的主(zhu)要區別在于默認(ren)的存取(qu)權限不同,struct默認(ren)為public,而class默認(ren)為private
18.
#include
#include
void getmemory(char *p)
{
p=(char *)malloc(100);
strcpy(p,"helloworld");
}
int main( )
{
char *str=NULL;
getmemory(str);
printf("%s/n",str);
free(str);
return 0;
}
答案:程序崩潰,getmemory中(zhong)的malloc 不能返回動(dong)態(tai)內存, free()對(dui)str操作很危險(xian)
19.
char szstr[10];
strcpy(szstr,"0123456789"); 產(chan)生(sheng)什么(me)結果?為什么(me)?
答(da)案: 長度不一樣(yang),會(hui)造成非(fei)法的OS
20.列(lie)舉幾種(zhong)進程的(de)同步機制,并比較其優缺點。
答案: 原子操(cao)作 信號量機制 自(zi)旋(xuan)鎖 管程(cheng),會合(he),分布(bu)式系統

