華為c語言面試題_第1頁
華為c語言面試題_第2頁
華為c語言面試題_第3頁
華為c語言面試題_第4頁
華為c語言面試題_第5頁
已閱讀5頁,還剩63頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

華為C語言面試題集C語言面試題-華為C語言面試題深圳華為面試

C語言面試題

1、局部變量能否和全局變量重名?

答:能,局部會屏蔽全局。要用全局變量,需要使用"::"

局部變量可以與全局變量同名,在函數內引用這個變量時,會用

到同名的局部變量,而不會用到全局變量。對于有些編譯器而言,在

同一個函數內可以定義多個同名的局部變量,比如在兩個循環體內都

定義一個同名的局部變量,而那個局部變量的作用域就在那個循環體

內。

2、如何引用一個已經定義過的全局變量?

答:extern

可以用引用頭文件的方式,也可以用extern關鍵字,如果用引用

頭文件方式來引用某個在頭文件中聲明的全局變理,假定你將那個變

寫錯了,那么在編譯期間會報錯,如果你用extern方式引用時?,假定

你犯了同樣的錯誤,那么在編譯期間不會報錯,而在連接期間報錯。

3、全局變量可不可以定義在可被多個.C文件包含的頭文件中?

為什么?

答:可以,在不同的C文件中以static形式來聲明同名全局變量。

可以在不同的C文件中聲明同名的全局變量,前提是其中只能有

一個C文件中對此變量賦初值,此時連接不會出錯

4、語句for(;1;)有什么問題?它是什么意思?

答:和while⑴相同。

5、do.......while和while.......do有什么區別?

答:前一個循環一遍再判斷,后一個判斷以后再循環

6、請寫出下列代碼的輸出內容

#include

main()

(

inta,b,c,d;

a=10;

b=a++;

c=++a;

d=10*a++;

printf("b,c,d:%d,%d,%d”,b,c,d);

return0;

)

答:10,12,120

7、static全局變量與普通的全局變量有什么區別?static局部變

量和普通局部變量有什么區別?static函數與普通函數有什么區別?

全局變量(外部變量)的說明之前再冠以static就構成了靜態的全

局變量。全局變量本身就是靜態存儲方式,靜態全局變量當然也是

靜態存儲方式。這兩者在存儲方式上并無不同。這兩者的區別雖在

于非靜態全局變量的作用域是整個源程序,當一個源程序由多個源

文件組成時,非靜態的全局變量在各個源文件中都是有效的。而靜

態全局變量則限制了其作用域,即只在定義該變量的源文件內有效,

在同一源程序的其它源文件中不能使用它。由于靜態全局變量的作用

域局限于一個源文件內,只能為該源文件內的函數公用,因此可以

避免在其它源文件中引起錯誤。

從以上分析可以看出,把局部變量改變為靜態變量后是改變了

它的存儲方式即改變了它的生存期。把全局變量改變為靜態變量后是

改變了它的作用域,限制了它的使用范圍。

static函數與普通函數作用域不同。僅在本文件。只在當前源文

件中使用的函數應該說明為內部函數(static),內部函數應該在當前源

文件中說明和定義。對于可在當前源文件以外使用的函數,應該在一

個頭文件中說明,要使用這些函數的源文件要包含這個頭文件

static全局變量與普通的全局變量有什么區別:static全局變量只

初使化一次,防止在其他文件單元中被引用;

static局部變量和普通局部變量有什么區別:static局部變量只被

初始化一次,下一次依據上一次結果值;

static函數與普通函數有什么區別:static函數在內存中只有一份,

普通函數在每個被調用中維持一份拷貝.

8、程序的局部變量存在于(堆棧)中,全局變量存在于(靜態

區)中,動態申請數據存在于(堆)中。

9、設有以下說明和定義:

typedefunion{longi;intk[5];charc;}DATE;

structdata{intcat;DATEcow;doubledog;}too;

DATEmax;

則語句printf("%d",sizeof(structdate)+sizeof(max));的執行結果是:

-52

答:DATE是一個union,變量公用空間.里面最大的變量類型是

int[5],占用20個字節.所以它的大小是20

data是一個struct,每個變量分開占用空間.依次為int4+DATE20+

doubles=32.

所以結果是20+32=52.

當然…在某些16位編輯器下,int可能是2字節,那么結果是int2+

DATE10+doubles=20

10、隊列和棧有什么區別?

隊列先進先出,棧后進先出

11、寫出下列代碼的輸出內容

#include

intinc(inta)

(

return什+a);

)

intmulti(int*a,int*bjnt*c)

return(*c=*a**b);

)

typedefint(FUNCl)(intin);

typedefint(FUNC2)(int*,int*,int*);

voidshow(FUNC2funjntargl,int*arg2)

(

INCp=&inc;

inttemp=p(argl);

fun(&temp,&argl,arg2);

printf("%d\n",*arg2);

)

main()

(

inta;

show(multi,10,&a);

return0;

}

答:110

12、請找出下面代碼中的所以錯誤

說明:以下代碼是把一個字符串倒序,如“abed”倒序后變為“dcba”

1、#include"string.h"

2、main()

3、(

4、char*src="hello/world";

5、char*dest=NULL;

6、intlen=strlen(src);

7、dest=(char*)malloc(len);

8、char*d=dest;

9、char*s=src[len];

10>while(len--!=O)

11、d++=s--;

12、printf("%s",dest);

13>return0;

14、)

答:

方法1:

intmain()

(

char*src="hell。,world”;

intlen=strlen(src);

char*dest=(char*)malloc(len+l);〃要為\0分配一個空間

char*d=dest;

char*s=&src[len-l];〃指向最后一個字符

while(len-!=0)

*d++=*s-;

*d=0;〃尾部要加\0

printf("%s\n",dest);

free(dest);//使用完,應當釋放空間,以免造成內存匯泄露

return0;

)

方法2:

#include

#include

main()

(

charstr[]="hello/world";

intlen=strlen(str);

chart;

for(inti=0;i{

t=str[i];

str[i]=str[len-i-l];str[len-i-l]=t;

printf("%s",str);

return0;

}

l.-l,2,7,28,,126請問28和126中間那個數是什么?為什么?

第一題的答案應該是4A3-1=63

規律是93-1(當n為偶數0,2,4)M3+1(當n為奇數1,3,5)

答案:63

2.用兩個棧實現一個隊列的功能?要求給出算法和思路!

設2個棧為A,B,一開始均為空.

入隊:

將新元素push入棧A;

出隊:

⑴判斷棧B是否為空;

(2)如果不為空,則將棧A中所有元素依次pop出并push到棧B;

⑶將棧B的棧頂元素pop出;

這樣實現的隊列入隊和出隊的平攤復雜度都還是0(。比上面的

幾種方法要好。3.在c語言庫函數中將一個字符轉換成整型的函數是

atool()嗎,這個函數的原型是什么?

函數名:atol

功能:把字符串轉換成長整型數

用longatol(constchar*nptr);

程序例:

#include

#include

intmain(void)

(

longI;

char*str="98765432";

I=atol(lstr);

printf("string=%sinteger=%ld\n",str,I);

return(O);

)

13.對于一個頻繁使用的短小函數,在C語言中應用什么實現,在

C++中應用什么實現?

c用宏定義,C++用inline

14.直接鏈接兩個信令點的一組鏈路稱作什么?

PPP點到點連接

15.接入網用的是什么接口?

16.voip都用了那些協議?

17.軟件測試都有那些種類?

黑盒:針對系統功能的測試

白合:測試函數功能,各函數接口

18.確定模塊的功能和模塊的接口是在軟件設計的那個隊段完成

的?

概要設計階段

19.

enumstring

xl,

x2,

x3=10,

x4,

x5,

)x;

問x=0x801005,0x80lOf4;

20.

unsignedchar*pl;

unsignedlong*p2;

pl=(unsignedchar*)0x801000;

p2=(unsignedlong*)0x810000;

請問pl+5=;

p2+5=;

選擇題:

21.Ethternet鏈接到Internet用到以下那個協議?

A.HDLC;B.ARP;C.UDP;D.TCP;E.ID

22.屬于網絡層協議的是:

A.TCP;B.IP;C.ICMP;D.X,25

23.Windows消息調度機制是:

A.指令隊列;B.指令堆棧;C.消息隊列;D.消息堆棧;

24.

unsignedshorthash(unsignedshortkey)

(

return(key?)%256

}

請問hash(16),hash(256)的值分別是:

A.1.16;B.8.32;C.4.16;D.1.32

找錯題:

25.請問下面程序有什么錯誤?

inta[60][250][1000],i,j,k;

for(k=0;k<=1000;k++)

for(j=0;j<250;j++)

for(i=0;i<60;i++)

a[i][j][k]=O;

把循環語句內外換一下

26.

#defineMax_CB500

voidLmiQueryCSmd(StructMSgCB*pmsg)

(

unsignedcharucCmdNum;

for(ucCmdNum=0;ucCmdNum

)

死循環

27.以下是求一個數的平方的程序,請找出錯誤:

#defineSQUARE(a)((a)*(a))

inta=5;

intb;

b=SQUARE(a++);

28.

typedefunsignedcharBYTE

intexamply_fun(BYTEgtjen;BYTE*gt_code)

(

BYTE*gt_buf;

gt_buf=(BYTE*)MALLOC(Max_GT_Length);

if(gt_len>Max_GT_Length)

returnGT_Length_ERROR;

}

}

問答題:

29.IPPhone的原理是什么?

IPV6

30.TCP/IP通信建立的過程怎樣,端口有什么作用?

三次握手,確定是哪個應用程序使用該協議

31.1號信令和7號信令有什么區別,我國某前廣泛使用的是那一

種?

答:

1號信令接續慢,但是穩定,可靠。

7號信令的特點是:信令速度快,具有提供大量信令的潛力,具有改

變和增加信令的靈活性,便于開放新業務,在通話時可以隨意處理信

令,成本低。目前得到廣泛應用。

TCP與UDP的區別:

TCP是面向連接的協議,就象打電話;而UDP是無連接的協議,就象

郵寄信件。

TCP是可靠的,它需要確認,而UDP是不可靠的,因為它不需要確認。

所以一般情況下重要數據的傳輸都用TCP,不太重要的,丟失后不會

造成太大影響的數據都用UDP來傳輸。

與TCP相比,UDP幀的長度要小的多。

預處理器(Preprocessor)

1.用預處理指令#define聲明一個常數,用以表明1年中有多少秒(忽

略閏年問題)

#defineSECONDS_PER_YEAR(60*60*24*365)UL

我在這想看到兒件事情:

1).#define語法的基本知識(例如:不能以分號結束,括號的使用,

等等)

2).懂得預處理器將為你計算常數表達式的值,因此,直接寫出你是

如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代

價的。

3).意識到這個表達式將使一個16位機的整型數溢出-因此要用到長

整型符號L,告訴編譯器這個常數是的長整型數。

4).如果你在你的表達式中用到UL(表示無符號長整型),那么你有

了一個好的起點。記住,第一印象很重要。

C++面試題集,C++面試答案,C++面試,C++試題,C++試卷

2.寫一個“標準”宏MIN,這個宏輸入兩個參數并返回較小的一個。

#defineMIN(A,B)(A<=B?A:B)

C\C++試題集C\C++Development這個測試是為下面的目的而設的:

1).標識#define在宏中應用的基本知識。這是很重要的,因為直到嵌

入(inline)操作符變為標準C的一部分,宏是方便產生嵌入代碼的唯一

方法,對于嵌入式系統來說,為了能達到要求的性能,嵌入代碼經常

是必須的方法。

2).三重條件操作符的知識。這個操作符存在C語言中的原因是它使

得編譯器能產生比if-then-else更優化的代碼,了解這個用法是很重要

的。

3).懂得在宏中小心地把參數用括號括起來

4).我也用這個問題開始討論宏的副作用,例如:當你寫下面的代碼

時會發生什么事?

least=MIN(*p++,b);

3.預處理器標識#error的目的是什么?

如果你不知道答案,請看參考文獻1。這問題對區分一個正常的伙計

和一個書呆子是很有用的。只有書呆子才會讀C語言課本的附錄去找

出象這種

問題的答案。當然如果你不是在找一個書呆子,那么應試者最好希望

自己不要知道答案。

死循環(Infiniteloops)

4.嵌入式系統中經常要用到無限循環,你怎么樣用C編寫死循環呢?

這個問題用兒個解決方案。我首選的方案是:

while(l){}

一些程序員更喜歡如下方案:

for(;;){}

這個實現方式讓我為難,因為這個語法沒有確切表達到底怎么回事。

如果一個應試者給出這個作為方案,我將用這個作為一個機會去探究

他們這樣做的

基本原理。如果他們的基本答案是:“我被教著這樣做,但從沒有想

到過為什么。”這會給我留下一個壞印象。

第三個方案是用goto

Loop:

gotoLoop;

應試者如給出上面的方案,這說明或者他是一個匯編語言程序員(這

也許是好事)或者他是一個想進入新領域的BASIC/FORTRAN程序員。

數據聲明(Datadeclarations)

5.用變量a給出下面的定義

a)一個整型數(Aninteger)

b)一個指向整型數的指針(Apointertoaninteger)

c)一個指向指針的的指針,它指向的指針是指向一個整型數(A

pointertoapointertoaninteger)

d)一個有10個整型數的數組(Anarrayof10integers)

e)一個有10個指針的數組,該指針是指向一個整型數的(Anarrayof

10pointerstointegers)

f)一個指向有10個整型數數組的指針(Apointertoanarrayof10

integers)

g)一個指向函數的指針,該函數有一個整型參數并返回一個整型數

(Apointertoafunctionthattakesanintegerasanargumentand

returnsaninteger)

h)一個有10個指針的數組,該指針指向一個函數,該函數有一個整

型參數并返回一個整型數(Anarrayoftenpointerstofunctionsthat

takeanintegerargumentandreturnaninteger)

答案是:

a)inta;//Aninteger

b)int*a;//Apointertoaninteger

c)int**a;//Apointertoapointertoaninteger

d)inta[10];//Anarrayof10integers

e)int*a[10];//Anarrayof10pointerstointegers

f)int(*a)[10];//Apointertoanarrayof10integers

g)int(*a)(int);//Apointertoafunctionathattakesaninteger

argumentandreturnsaninteger

h)int(*a[10])(int);//Anarrayof10pointerstofunctionsthattakean

integerargumentandreturnaninteger

人們經常聲稱這里有兒個問題是那種要翻一下書才能回答的問題,我

同意這種說法。當我寫這篇文章時,為了確定語法的正確性,我的確

查了一下書。

但是當我被面試的時候,我期望被問到這個問題(或者相近的問題)。

因為在被面試的這段時間里,我確定我知道這個問題的答案。應試者

如果不知道

所有的答案(或至少大部分答案),那么也就沒有為這次面試做準備,

如果該面試者沒有為這次面試做準備,那么他又能為什么出準備呢?

Static

6.關鍵字static的作用是什么?

這個簡單的問題很少有人能回答完全。在C語言中,關鍵字static有

三個明顯的作用:

1).在函數體,一個被聲明為靜態的變量在這一函數被調用過程中維

持其值不變。

2).在模塊內(但在函數體外),一個被聲明為靜態的變量可以被模塊

內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全

局變量。

3).在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函

數調用。那就是,這個函數被限制在聲明它的模塊的本地范圍內使用。

大多數應試者能正確回答第一部分,一部分能正確回答第二部分,同

是很少的人能懂得第三部分。這是一個應試者的嚴重的缺點,因為他

顯然不懂得本地化數據和代碼范圍的好處和重要性。

Const

7.關鍵字const是什么含意?

我只要一聽到被面試者說:“const意味著常數”,我就知道我正在和

一個業余者打交道。去年DanSaks已經在他的文章里完全概括了

const的所有用法,因止匕ESP(譯者:EmbeddedSystemsProgramming)

的每一位讀者應該非常熟悉const能做什么和不能做什么.

如果你從沒有讀到那篇文章,只要能說出const意味著“只讀”就可

以了。盡管這個答案不是完全的答案,但我接受它作為一個正確的答

案。(如果你想知道更詳細的答案,仔細讀一下Saks的文章吧。)如

果應試者能正確回答這個問題,我將問他一個附加的問題:下面的聲

明都是什么意思?

constinta;

intconsta;

constint*a;

int*consta;

intconst*aconst;

前兩個的作用是一樣,a是一個常整型數。第三個意味著a是一個指

向常整型數的指針(也就是,整型數是不可修改的,但指針可以)。

第四個意思a是一個指向整型數的常指針(也就是說,指針指向的整

型數是可以修改的,但指針是不可修改的)。最后一個意味著a是一

個指向常整型數的常指針(也就是說,指針指向的整型數是不可修改

的,同時指針也是不可修改的)。如果應試者能正確回答這些問題,

那么他就給我留下了一個好印象。順帶提一句,也許你可能會問,即

使不用關鍵字const,也還是能很容易寫出功能正確的程序,那么我

為什么還要如此看重關鍵字const呢?我也如下的兒下理由:

1).關鍵字const的作用是為給讀你代碼的人傳達非常有用的信息,

實際上,聲明一個參數為常量是為了告訴了用戶這個參數的應用目的。

如果你曾花很多時間清理其它人留下的垃圾,你就會很快學會感謝這

點多余的信息。(當然,懂得用const的程序員很少會留下的垃圾讓

別人來清理的。)

2).通過給優化器一些附加的信息,使用關鍵字const也許能產生更

緊湊的代碼。

3).合理地使用關鍵字const可以使編譯器很自然地保護那些不希望

被改變的參數,防止其被無意的代碼修改。簡而言之,這樣可以減少

bug的出現。

Volatile

8.關鍵字volatile有什么含意并給出三個不同的例子。

一個定義為volatile的變量是說這變量可能會被意想不到地改變,這

樣,編譯器就不會去假設這個變量的值了。精確地說就是,優化器在

用到這個變量時必須每次都小心地重新讀取這個變量的值,而不是使

用保存在寄存器里的備份。下面是volatile變量的兒個例子:

1).并行設備的硬件寄存器(如:狀態寄存器)

2).一個中斷服務子程序中會訪問到的非自動變量(Non-automatic

variables)

3).多線程應用中被兒個任務共享的變量

回答不出這個問題的人是不會被雇傭的。我認為這是區分C程序員和

嵌入式系統程序員的最基本的問題。嵌入式系統程序員經常同硬件、

中斷、RTOS等等打交道,所用這些都要求volatile變量。不懂得volatile

內容將會帶來災難。

假設被面試者正確地回答了這是問題(嗯,懷疑這否會是這樣),我

將稍微深究一下,看一下這家伙是不是直正懂得volatile完全的重要

性。

1).一個參數既可以是const還可以是volatile嗎?解釋為什么。

2).一個指針可以是volatile嗎?解釋為什么。

3).下面的函數有什么錯誤:

intsquare(volatileint*ptr)

return*ptr**ptr;

)

下面是答案:

1).是的。一個例子是只讀的狀態寄存器。它是volatile因為它可能被

意想不到地改變。它是const因為程序不應該試圖去修改它。

2).是的。盡管這并不很常見。一個例子是當一個中服務子程序修該

一個指向一個buffer的指針時。

3).這段代碼的有個惡作劇。這段代碼的目的是用來返指針*ptr指向

值的平方,但是,由于*ptr指向一個volatile型參數,編譯器將產生

類似下面的代碼:

intsquare(volatileint*ptr)

(

inta,b;

a=*ptr;

b=*ptr;

returna*b;

}

由于*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結

果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:

longsquare(volatileint*ptr)

inta;

a=*ptr;

returna*a;

}

位操作(Bitmanipulation)

9.嵌入式系統總是要用戶對變量或寄存器進行位操作。給定一個整

型變量a,寫兩段代碼,第一個設置a的bit3,第二個清除a的bit3。

在以上兩個操作中,要保持其它位不變。

對這個問題有三種基本的反應

1).不知道如何下手。該被面者從沒做過任何嵌入式系統的工作。

2).用bitfieldSoBitfields是被扔到C語言死角的東西,它保證你的代

碼在不同編譯器之間是不可移植的,同時也保證了的你的代碼是不可

重用的。我最近不幸看到Infineon為其較復雜的通信芯片寫的驅動程

序,它用到了bitfields因此完全對我無用,因為我的編譯器用其它的

方式來實現bitfields的。從道德講:永遠不要讓一個非嵌入式的家伙

粘實際硬件的邊。

3).用#defines和bitmasks操作。這是一個有極高可移植性的方法,

是應該被用到的方法。最佳的解決方案如下:

#defineBIT3(0xl?3)

staticinta;

voidset_bit3(void)

a|=BIT3;

}

voidclear_bit3(void)

(

a&=~BIT3;

}

一些人喜歡為設置和清除值而定義一個掩碼同時定義一些說明常數,

這也是可以接受的。我希望看到兒個要點:說明常數、|=和&=~操作。

訪問固定的內存位置(Accessingfixedmemorylocations)C\C++

Development

10.嵌入式系統經常具有要求程序員去訪問某特定的內存位置的特

點。在某工程中,要求設置一絕對地址為0x67a9的整型變量的值為

0xaa66o編譯器是一個純粹的ANSI編譯器。寫代碼去完成這一任務。

這一問題測試你是否知道為了訪問一絕對地址把一個整型數強制轉

換(typecast)為一指針是合法的。這一問題的實現方式隨著個人風

格不同而不同。典型的類似代碼如下:

int*ptr;

ptr=(int*)0x67a9;

*ptr=0xaa55;

一個較晦澀的方法是:

*(int*const)(0x67a9)=0xaa55;

即使你的品味更接近第二種方案,但我建議你在面試時使用第一種方

案。

中斷(Interrupts)

11.中斷是嵌入式系統中重要的組成部分,這導致了很多編譯開發商

提供一種擴展一讓標準C支持中斷。具代表事實是,產生了一個新的

關鍵字_interrupto下面的代碼就使用了—interrupt關鍵字去定義了

一個中斷服務子程序(ISR),請評論一下這段代碼的。

_interruptdoublecompute_area(doubleradius)

(

doublearea=PI*radius*radius;

printf("Area=%f",area);

returnarea;

}

這個函數有太多的錯誤了,以至讓人不知從何說起了:

1).ISR不能返回一個值。如果你不懂這個,那么你不會被雇用的。

2).ISR不能傳遞參數。如果你沒有看到這一點,你被雇用的機會等同

第一項。

3).在許多的處理器/編譯器中,浮點一般都是不可重入的。有些處理

器/編譯器需要讓額處的寄存器入棧,有些處理器/編譯器就是不允許

在ISR中做浮點運算。此外,ISR應該是短而有效率的,在ISR中做浮

點運算是不明智的。

4).與第三點一脈相承,printf()經常有重入和性能上的問題。如果你

丟掉了第三和第四點,我不會太為難你的。不用說,如果你能得到后

兩點,那么你的被雇用前景越來越光明了。

代碼例子(Codeexamples)

12.下面的代碼輸出是什么,為什么?

voidfoo(void)

(

unsignedinta=6;

intb=-20;

(a+b>6)puts(">6"):puts("<=6");

}

這個問題測試你是否懂得c語言中的整數自動轉換原則,我發現有些

開發者懂得極少這些東西。不管如何,這無符號整型問題的答案是輸

出是“>6”。原因是當表達式中存在有符號類型和無符號類型時所有

的操作數都自動轉換為無符號類型。因此-20變成了一個非常大的正

整數,所以該表達式計算出的結果大于6。這一點對于應當頻繁用到

無符號數據類型的嵌入式系統來說是豐常重要的。如果你答錯了這個

問題,你也就到了得不到這份工作的邊緣。

13.評價下面的代碼片斷:

unsignedintzero=0;

unsignedintcompzero=OxFFFF;

/*l'scomplementofzero*/

對于一個int型不是16位的處理器為說,上面的代碼是不正確的。應

編寫如下:

unsignedintcompzero=~0;

這一問題真正能揭露出應試者是否懂得處理器字長的重要性。在我的

經驗里,好的嵌入式程序員非常準確地明白硬件的細節和它的局限,

然而PC機程序往往把硬件作為一個無法避免的煩惱。

到了這個階段,應試者或者完全垂頭喪氣了或者信心滿滿志在必得。

如果顯然應試者不是很好,那么這個測試就在這里結束了。但如果顯

然應試者做得不錯,那么我就扔出下面的追加問題,這些問題是比較

難的,我想僅僅非常優秀的應試者能做得不錯。提出這些問題,我希

望更多看到應試者應付問題的方法,而不是答案。不管如何,你就當

是這個娛樂吧…

動態內存分配(Dynamicmemoryallocation)

14.盡管不像非嵌入式計算機那么常見,嵌入式系統還是有從堆

(heap)中動態分配內存的過程的。那么嵌入式系統中,動態分配內

存可能發生的問題是什么?

這里,我期望應試者能提到內存碎片,碎片收集的問題,變量的持行

時間等等。這個主題已經在ESP雜志中被廣泛地討論過了(主要是PJ.

Plauger,他的解釋遠遠超過我這里能提到的任何解釋),所有回過頭

看一下這些雜志吧!讓應試者進入一種虛假的安全感覺后,我拿出這

么一個小節目:下面的代碼片段的輸出是什么,為什么?

char*ptr;

if((ptr=(char*)malloc(0))==NULL)

puts("Gotanullpointer");

else

puts("Gotavalidpointer");

這是一個有趣的問題。最近在我的一個同事不經意把0值傳給了函數

malloc,得到了一個合法的指針之后,我才想到這個問題。這就是上

面的代碼,該代碼的輸出是“Gotavalidpointer"。我用這個來開始討

論這樣的一問題,看看被面試者是否想到庫例程這樣做是正確。得到

正確的答案固然重要,但解決問題的方法和你做決定的基本原理更重

要些。

Typedef

15.Typedef在C語言中頻繁用以聲明一個已經存在的數據類型的同

義字。也可以用預處理器做類似的事。例如,思考一下下面的例子:

#definedPSstructs*

typedefstructs*tPS;

以上兩種情況的意圖都是要定義dPS和tPS作為一個指向結構s指

針。哪種方法更好呢?(如果有的話)為什么?

這是一個非常微妙的問題,任何人答對這個問題(正當的原因)是應

當被恭喜的。答案是:typedef更好。思考下面的例子:

dPSpl,p2;

tPSp3,p4;

第一個擴展為

structs*pl,p2;

上面的代碼定義pl為一個指向結構的指,p2為一個實際的結構,這

也許不是你想要的。第二個例子正確地定義了p3和p4兩個指針。

晦澀的語法

16.C語言同意一些令人震驚的結構,下面的結構是合法的嗎,如果是

它做些什么?

inta=5,b=7,c;

c=a+++b;

這個問題將做為這個測驗的一個愉快的結尾。不管你相不相信,上面

的例子是完全合乎語法的。問題是編譯器如何處理它?水平不高的編

譯作者實際上會爭論這個問題,根據最處理原則,編譯器應當能處理

盡可能所有合法的用法。因此,上面的代碼被處理成:

c=a+++b;

因此,這段代碼持行后a=6,b=7,c=12。

如果你知道答案,或猜出正確答案,做得好。如果你不知道答案,我

也不把這個當作問題。我發現這個問題的最大好處是:這是一個關于

代碼編寫風格,代碼的可讀性,代碼的可修改性的好的話題

Whatwillprintout?

main()

(

char*pl="name";

char*p2;

p2=(char*)malloc(20);

memset(p2,0,20);

while(*p2++=*pl++);

printf("%sn”,p2);

)

Answer:emptystring.

Whatwillbeprintedastheresultoftheoperationbelow:

main()

intx=20,y=35;

x=y+++x++;

y=++y+++x;

printf("%d%dn",x,y);

}

Answer:5794

Whatwillbeprintedastheresultoftheoperationbelow:

main()

(

intx=5;

printf("%d,%d,%dn",x,x<<2,x>>2);

)

Answer:5,20,1

Whatwillbeprintedastheresultoftheoperationbelow:

#defineswap(a,b)a=a+b;b=a-b;a=a-b;

voidmain()

(

intx=5,y=10;

swap(x,y);

printf(z/%d%dn”,x,y);

swap2(x,y);

printf("%d%dn",x,y);

)

intswap2(inta,intb)

{

inttemp;

temp=a;

b=a;

a=temp;

return0;

}

Answer:10,5

10,5

Whatwillbeprintedastheresultoftheoperationbelow:

main()

(

char*ptr="CiscoSystems'7;

*ptr++;printf("%sn”,ptrj;

ptr++;

printf("%sn”,ptrj;

}

Answer:CiscoSystems

iscosystems

Whatwillbeprintedastheresultoftheoperationbelow:

main()

(

charsl[]="Cisco";

chars2[]="systems";

printf("%s”,sl);

}

Answer:Cisco

Whatwillbeprintedastheresultoftheoperationbelow:

main()

(

char*pl;

char*p2;

pl=(char*)malloc(25);

p2=(char*)malloc(25);

strcpy(pl,"Cisco");

strcpy(p2,“systems");

strcat(pl,p2);

printf("%s”,pl);

}

Answer:Ciscosystems

Thefollowingvariableisavailableinfilel.c,whocanaccessit?:

staticintaverage;

Answer:allthefunctionsinthefilel.ccanaccessthevariable.

WHatwillbetheresultofthefollowingcode?

#defineTRUE0//somecode

while(TRUE)

(

//somecode

}

Answer:ThiswillnotgointotheloopasTRUEisdefinedas0.

Whatwillbeprintedastheresultoftheoperationbelow:

intx;

intmodifyvalue()

return(x+=10);

}

intchangevalue(intx)

(

return(x+=l);

}

voidmain()

(

intx=10;

x++;

changevalue(x);

x++;

modifyvalue();

printf("Firstoutput:%dn",x);

x++;

changevalue(x);

printf("Secondoutput:%dn",x);

modifyvalue();

printf("Thirdoutput:%dn",x);

)

Answer:12,13,13

Whatwillbeprintedastheresultoftheoperationbelow:

main()

(

intx=10,y=15;

x=x++;

y=++y;

printf("%d%dn”,x,y);

)

Answer:11,16

Whatwillbeprintedastheresultoftheoperationbelow:

main()

inta=0;

if(a==O)

printf(MCiscoSystemsn");

printf(MCiscoSystemsn");

}

Answer:Twolineswith“CiscoSystems'7willbeprinted.

再次更新C++相關題集

I.以下三條輸出語句分別輸出什么?[C易]

charstrl[]="abc";

charstr2[]="abc";

constcharstr3[]="abc";

constcharstr4[]="abc";

constchar*str5="abc";

constchar*str6="abc";

cout?boolalpha?(strl==str2)?endl;//輸出什么?

cout?boolalpha?(str3==str4)?endl;//輸出什么?

cout?boolalpha?(str5==str6)?endl;//輸出什么?

13.非C++內建型別A和B,在哪幾種情況下B能隱式轉化為A?

[C++中等]

答:

a.classB:publicA{.....}〃B公有繼承自A,可以是間接繼承的

b.classB{operatorA();}//B實現了隱式轉化為A的轉化

c.classA{A(constB&);}〃A實現了non-explicit的參數為B(可以有

其他帶默認值的參數)構造函數

d.A&operator=(constA&);//賦值操作,雖不是正宗的隱式類型轉

換,但也可以勉強算一個

12.以下代碼中的兩個sizeof用法有問題嗎?[C易]

voidUpperCase(charstr[])//將str中的小寫字母轉換成大寫字母

(

for(size_ti=0;i<sizeof(str)/sizeof(str[0]);++i)

if('a'<=str[i]&&str[i]<='z')

str[i]-=('a'-'A');

}

charstr[]="aBcDe";

cout?"str字符長度為:"?sizeof(str)/sizeof(str[0])?endl;

UpperCase(str);

cout?str?endl;

7.以下代碼有什么問題?[C難]

voidchar2Hex(charc)//將字符以16進制表示

charch=c/0xl0+'O';if(ch>'9')ch+=('A'-'9'"l);

charcl=c%OxlO+'O';if(cl>'9')cl+=('A'-'Q'-l);

cout?ch?cl?'

)

charstr[]="Ilove中國”;

for(size_ti=0;i<strlen(str);++i)

char2Hex(str[i]);

cout?endl;

4.以下代碼有什么問題?[C++易]

structTest

(

Test(int){}

Test(){}

voidfun(){}

};

voidmain(void)

Testa(l);

a.fun();

Testb();

b.fun();

}

5.以下代碼有什么問題?[C++易]

cout?(true?l:"l")?endl;

8.以下代碼能夠編譯通過嗎,為什么?[C++易]

unsignedintconstsizel=2;

charstrl[sizel];

unsignedinttemp=0;

cin?temp;

unsignedintconstsize2=temp;

charstr2[size2];

9.以下代碼中的輸出語句輸出。嗎,為什么?[C++易]

structCLS

(

intm_i;

CLS(inti):m_i(i){}

CLS()

CLS(O);

}

);

CLSobj;

cout?obj.mj?endl;

10.C++中的空類,默認產生哪些類成員函數?[C++易]

答:

classEmpty

(

public:

Empty();//缺省構造函數

Empty(constEmpty&);//拷貝構造函數

~Empty();//析構函數

Empty&operator=(constEmpty&);//賦值運算符

Empty*operator&();//取址運算符

constEmpty*operator&()const;//取址運算符const

);

3.以下兩條輸出語句分別輸出什么?[C++難]

floata=l.Of;

cout?(int)a?endl;

cout?(int&)a?endl;

cout?boolalpha?((int)a==(int&)a)?endl;//輸出什么?

floatb=O.Of;

cout?(int)b?endl;

cout?(int&)b?endl;

cout?boolalpha?((int)b==(int&)b)?endl;//輸出什么?

2.以下反向遍歷array數組的方法有什么錯誤?[STL易]

vectorarray;

array.push_back(1);

array.push_back(2);

array.push_back(3);

for(vector::size_typei=array.size()-l;i>=0;--i)//反向遍歷array數組

(

cout?array[i]?endl;

)

6.以下代碼有什么問題?[STL易]

typedefvectorIntArray;

IntArrayarray;

array.push_back(1);

array.push_back(2);

array.push_back(2);

array.push_back(3);

//刪除array數組中所有的2

for(lntArray::iteratoritor=array.begin();itor!=array.end();++itor)

(

if(2==*itor)array.erase(itor);

}

11.寫一個函數,完成內存之間的拷貝。[考慮問題是否全面]

答:

程序代碼

void*mymemcpy(void*dest,constvoid*src,size_tcount)

(

char*pdest=static_cast<char*>(dest);

constchar*psrc=static_cast<constchar*>(src);

if(pdest>psrc&&pdest<psrc+cout)能考慮到這種情況就行了

(

for(size_ti=count-l;i!=-l;-i)

pdest[i]=psrc[i];

}

else

for(size_ti=0;i<count;++i)

pdest[i]=psrc[i];

}

returndest;

}

intmain(void)

(

charstr[]="0123456789";

mymemcpy(str+1,str+O,9);

cout?str?endl;

system("Pause");

return0;

}

華為的C\C++面試題

QI:請你分別劃劃OSI的七層網絡結構圖,和TCP/IP的五層結構圖?

:Q2:請你詳細的解釋一下IP協議的定義,在哪個層上面,主要有什

么作用?

:TCP與UDP呢?

:總得來說前面兩道題目還是比較簡單的!

:Q3:請問交換機和路由器分別的實現原理是什么?分別在哪個層次

上面實

:現的?

:Q4:請問C++的類和C里面的struct有什么區別?

:Q5:請講一講析構函數和虛函數的用法和作用?

:Q6:全局變量和局部變量有什么區別?實怎么實現的?操作系統和

編譯器

:是怎么知道的?

:Q7:一些寄存器的題目,我忘記了具體實什么題目,主要好像是尋址

和內

:存管理等一些知識,不記得了。

:Q8:8086是多少尉的系統?在數據總線上是怎么實現的?還有一些

硬件方

:面的知識我既不清楚了。

:一般建議參加華為的研發面試的同學先要準備一下相關的知識,軟

件的主要

:是看看C和數據結構方面的,硬件模電,數電和微機原理

兩道C面試題

1、一個學生的信息是:姓名,學號,性別,年齡等信息,用一個鏈

表,把這些學生信息連在一起,給出一個age,在些鏈表中刪除學生

年齡等于age的學生信息。

程序代碼

#1nclude"stdio.h"

#Include"conio.h"

structstu{

charname[20];

charsex;

intno;

intage;

structstu*next;

}*linklist;

structstu*creatlist(intn)

(

intI;

〃h為頭結點,p為前一結點,s為當前結點

structstu*h,*p,*s;

h=(structstu*)malloc(sizeof(structstu));

h->next=NULL;

P=h;

for(i=0;i<n;i++)

(

s=(structstu*)malloc(sizeof(structstu));

p->next=s;

printf("Pleaseinputtheinformationofthestudent:namesex

noage\n");

scanf("%s%c%d%d",s->name/&s->sex/&s->no/&s->age);

s->next=NULL;

P=s;

}

printf("Createsuccessful!");

return(h);

}

voiddeletelist(structstu*s,inta)

(

structstu*p;

while(s->age!=a)

P=s;

s=s->next;

)

if(s==NULL)

printf("Therecordisnotexist.");

else

(

p->next=s->next;

printf("Deletesuccessful!");

}

)

voiddisplay(structstu*s)

(

s=s->next;

while(s!=NULL)

(

printf("%s%c%d%d\n",s->name/s->sex/s->no,s->age);

s=s->next;

}

}

intmain()

structstu*s;

intn,age;

printf("Pleaseinputthelengthofseqlist:\n");

scanf("%d"/&n);

s=creatlist(n);

display(s);

printf("Pleaseinputtheage:\n");

scanf("%d",&age);

deletelist(s,age);

display(s);

return0;

}

2、實現一個函數,把一個字符串中的字符從小寫轉為大寫。

程序代碼

#1nclude"stdio.h"

#Include"conio.h"

voiduppers(char*s,char*us)

for(;*s!='\0';s++/us++)

if(*s>='a'&&*s<='z')

*us=*s-32;

else

*us=*s;

}

*us='\0';

)

intmain()

(

char*s/us;

charss[20];

printf("Pleaseinputastring:\n");

scanf("%s",ss);

s=ss;

uppers(s,us);

printf("Theresultis:\n%s\n",us);

getch();

}

1)筆試可以選擇java和C++,我做的java,個人感覺考的很基礎。

其中一個編程題:用數組實現棧,并且當棧空間滿時,棧空間增加一

倍。

2)面試:我面的是it類

一面:技術面,40分鐘,問的很細,uml,單點登錄,j2ee

二面:綜合面,20分鐘一個項目完整的經歷

三面:hr,職業規劃,優勢與劣勢,期望工資與工作地點。5.8ko

四面:老總面,最郁悶的,看了簡歷的封面,說專業不適合去華為工

作。無語,也不想去,因為待遇說實話也不怎么樣,并且就憑專業的

名稱淘汰

華為筆試題含答案

.寫出判斷ABCD四個表達式的是否正確,若正確,寫出經過表達式中

a的值(3分)

inta=4;

(A)a+=(a++);(B)a+=(++a);(C)(a++)+=a;(D)(++a)+=(a++);

a=?

答:C錯誤,左側不是一個有效變量,不能賦值,可改為(++a)+=a;

改后答案依次為9,10,10,11

2.某32位系統下,C++程序,請計算sizeof的值(5分).

charstr[]="”

char*p=str;

intn=10;

請計算

sizeof(str)=?(1)

sizeof(p)=?(2)

sizeof(n)=?(3)

voidFoo(charstr[100]){

請計算

sizeof(str)=?(4)

}

void*p=malloc(100);

請計算

sizeof(p)=?(5)

答:(1)17(2)4(3)4(4)4(5)4

3.回答下面的問題.(4分)

⑴.頭文件中的ifndef/define/endif干什么用?預處理

答:防止頭文件被重復引用

(2).#include和#include"filename.h”有什么區別?

答:前者用來包含開發環境提供的庫頭文件,后者用來包含自己編寫

的頭文件。

(3).在C++程序中調用被C編譯器編譯后的函數,為什么要加

extern"C"聲明?

答:函數和變量被C++編譯后在符號庫中的名字與C語言的不同,被

extern修飾的變量和函數是按照C語言方式編譯和連接的。由于

編譯后的名字不同,C++程序不能直接調用C函數。C++提供了一個C

連接交換指定符號extern“C”來解決這個問題。

(4).switch。中不允許的數據類型是?

答:實型

4.回答下面的問題(6分)

(1).

VoidGetMemory(char**p,intnum){

*p=(char*)malloc(num);

}

voidTest(void){

char*str=NULL;

GetMemory(&str,100);

strcpy(str,"hello");

printf(str);

}

請問運行Test函數會有什么樣的結果?

答:輸出“hello”

(2).

voidTest(void){

char*str=(char*)malloc(lOO);

strcpy(str,"hello");

free(str);

if(str!=NULL){

strcpy(str,"world");

printf(str);

}

}

請問運行Test函數會有什么樣的結果?

答:輸出"world”,因為free(str)后并未改變str所指的內存內容。

(3).

char*GetMemory(void){

charp[]="helloworld";

returnp;

}

voidTest(void){

char*str=NULL;

str=GetMemoryO;

printf(str);

}

請問運行Test函數會有什么樣的結果?

答:無效的指針,輸出不確定

5.編寫strcat函數(6分)

已知strcat函數的原型是char*strcat(char*strDest,constchar*strSrc);

其中strDest是目的字符串,strSrc是源字符串。

(1)不調用C++/C的字符串庫函數,請編寫函數strcat

答:

VC源碼:

char*_cdeclstrcat(char*dst,constchar*src)

(

char*cp=dst;

while(*cp)

cp++;/*findendofdst*/

while(*cp++=*src++);/*Copysrctoendofdst*/

return(dst);/*returndst*/

}

(2)strcat能把strSrc的內容連接到strDest,為什么還要char*類

型的返回值?

答:方便賦值給其他變量

6.MFC中CString是類型安全類么?

答:不是,其它數據類型轉換到CString可以使用CString的成員函數

Format來轉換

7.C++中為什么用模板類。

答:(1)可用來創建動態增長和減小的數據結構

(2)它是類型無關的,因此具有很高的可復用性。

(3)它在編譯時而不是運行時檢查數據類型,保證了類型安全

(4)它是平臺無關的,可移植性

(5)可用于基本數據類型

8.CSingleLock是干什么的。

答:同步多個線程對一個數據類的同時訪問

9.NEWTEXTMETRIC是什么。

答:物理字體結構,用來設置字體的高寬大小

10.程序什么時候應該使用線程,什么時候單線程效率高。

答:L耗時的操作使用線程,提高應用程序響應

2.并行操作時使用線程,如C/S架構的服務器端并發線程響應用戶

的請求。

3.多CPU系統中,使用線程提高CPU利用率

4.改善程序結構。一個既長又復雜的進程可以考慮分為多個線程,

成為兒個獨立或半獨立的運行部分,這樣的程序會利于理解和修改。

其他情況都使用單線程。

ll.Windows是內核級線程么。

答:見下一題

12.Linux有內核級線程么。

答:線程通常被定義為一個進程中代碼的不同執行路線。從實現方式

上劃分,線程有兩種類型:“用戶級線程”和“內核級線程”。用戶線

程指不需要內核支持而在用戶程序中實現的線程,其不依賴于操作系

統核心,應用進程利用線程庫提供創建、同步、調度和管理線程的函

數來控制用戶線程。這種線程甚至在象DOS這樣的操作系統中也可

實現,但線程的調度需要用戶程序完成,這有些類似Windows3.x的

協作式多任務。另外一種則需要內核的參與,由內核完成線程的調度。

其依賴于操作系統核心,由內核的內部需求進行創建和撤銷,這兩種

模型各有其好處和缺點。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論