C語言面試題總匯基礎(chǔ)題、嵌入式、微軟、華為、思科……_第1頁
C語言面試題總匯基礎(chǔ)題、嵌入式、微軟、華為、思科……_第2頁
C語言面試題總匯基礎(chǔ)題、嵌入式、微軟、華為、思科……_第3頁
C語言面試題總匯基礎(chǔ)題、嵌入式、微軟、華為、思科……_第4頁
C語言面試題總匯基礎(chǔ)題、嵌入式、微軟、華為、思科……_第5頁
已閱讀5頁,還剩119頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

C語言面試題總匯基礎(chǔ)題、嵌入式、微軟、華為、思科……資料僅供參考基本C語言基礎(chǔ)題1

.

用預(yù)處理指令#define

聲明一個(gè)常數(shù),用以表明1年中有多少秒(忽略閏年問題)

#define

SECONDS_PER_YEAR

(60

*

60

*

24

*

365)UL

我在這想看到幾件事情:

#define

語法的基本知識(shí)(例如:不能以分號(hào)結(jié)束,括號(hào)的使用,等等)

懂得預(yù)處理器將為你計(jì)算常數(shù)表示式的值,因此,直接寫出你是如何計(jì)算一年中

有多少秒而不是計(jì)算出實(shí)際的值,是更清晰而沒有代價(jià)的。

意識(shí)到這個(gè)表示式將使一個(gè)16位機(jī)的整型數(shù)溢出‐因此要用到長(zhǎng)整型符號(hào)L,告訴編

譯器這個(gè)常數(shù)是的長(zhǎng)整型數(shù)。

如果你在你的表示式中用到UL(表示無符號(hào)長(zhǎng)整型),那么你有了一個(gè)好的起點(diǎn)

。記住,第一印象很重要。

2

.

寫一個(gè)“標(biāo)準(zhǔn)”宏MIN

,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)。

#define

MIN(A,B)

((A)

<=

(B)

?

(A)

:

(B))

這個(gè)測(cè)試是為下面的目的而設(shè)的:

標(biāo)識(shí)#define在宏中應(yīng)用的基本知識(shí)。這是很重要的,因?yàn)橹钡角度?inline)操作

符變?yōu)闃?biāo)準(zhǔn)C的一部分,宏是方便產(chǎn)生嵌入代碼的唯一方法,對(duì)于嵌入式系統(tǒng)來說,為了能

達(dá)到要求的性能,嵌入代碼經(jīng)常是必須的方法。

三重條件操作符的知識(shí)。這個(gè)操作符存在C語言中的原因是它使得編譯器能產(chǎn)生比

f‐then‐else更優(yōu)化的代碼,了解這個(gè)用法是很重要的。

懂得在宏中小心地把參數(shù)用括號(hào)括起來

我也用這個(gè)問題開始討論宏的副作用,例如:當(dāng)你寫下面的代碼時(shí)會(huì)發(fā)生什么事

?

least

=

MIN(*p++,

b);

3.

預(yù)處理器標(biāo)識(shí)#error的目的是什么?

如果你不知道答案,請(qǐng)看參考文獻(xiàn)1。這問題對(duì)區(qū)分一個(gè)正常的伙計(jì)和一個(gè)書呆子是很有用

的。只有書呆子才會(huì)讀C語言課本的附錄去找出象這種問題的答案。當(dāng)然如果你不是在一

個(gè)書呆子,那么應(yīng)試者最好希望自己不要知道答案。

死循環(huán)(Infinite

loops)

4.

嵌入式系統(tǒng)中經(jīng)常要用到無限循環(huán),你怎么樣用C編寫死循環(huán)呢?

這個(gè)問題用幾個(gè)解決方案。我首選的方案是:

while(1)

{

}

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

for(;;)

{

}

這個(gè)實(shí)現(xiàn)方式讓我為難,因?yàn)檫@個(gè)語法沒有確切表示到底怎么回事。如果一個(gè)應(yīng)試者給出這

個(gè)作為方案,我將用這個(gè)作為一個(gè)機(jī)會(huì)去探究她們這樣做的基本原理。如果她們的基本答案

是:“我被教著這樣做,但從沒有想到過為什么?!边@會(huì)給我留下一個(gè)壞印象。

第三個(gè)方案是用

goto

Loop:

...

goto

Loop;

應(yīng)試者如給出上面的方案,這說明或者她是一個(gè)匯編語言程序員(這可能是好事)或者她是

一個(gè)想進(jìn)入新領(lǐng)域的BASIC/FORTRAN程序員。

數(shù)據(jù)聲明(Data

declarations)

5.

用變量a給出下面的定義

a)

一個(gè)整型數(shù)(An

integer)

b)一個(gè)指向整型數(shù)的指針(

A

pointer

to

an

integer)

c)一個(gè)指向指針的的指針,它指向的指針是指向一個(gè)整型數(shù)(

A

pointer

to

a

pointer

to

an

intege)r

d)一個(gè)有10個(gè)整型數(shù)的數(shù)組(

An

array

of

10

integers)

e)

一個(gè)有10個(gè)指針的數(shù)組,該指針是指向一個(gè)整型數(shù)的。(An

array

of

10

pointers

to

integers)

f)

一個(gè)指向有10個(gè)整型數(shù)數(shù)組的指針(

A

pointer

to

an

array

of

10

integers)

g)

一個(gè)指向函數(shù)的指針,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)(A

pointer

to

a

function

that

takes

an

integer

as

an

argument

and

returns

an

integer)

h)一個(gè)有10個(gè)指針的數(shù)組,該指針指向一個(gè)函數(shù),該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)

An

array

of

ten

pointers

to

functions

that

take

an

integer

argument

and

return

an

integer

答案是:

a)

int

a;

//

An

integer

b)

int

*a;

//

A

pointer

to

an

integer

c)

int

**a;

//

A

pointer

to

a

pointer

to

an

integer

d)

int

a[10];

//

An

array

of

10

integers

e)

int

*a[10];

//

An

array

of

10

pointers

to

integers

f)

int

(*a)[10];

//

A

pointer

to

an

array

of

10

integers

g)

int

(*a)(int);

//

A

pointer

to

a

function

a

that

takes

an

integer

argument

an

d

returns

an

integer

h)

int

(*a[10])(int);

//

An

array

of

10

pointers

to

functions

that

take

an

integ

er

argument

and

return

an

integer

人們經(jīng)常聲稱這里有幾個(gè)問題是那種要翻一下書才能回答的問題,我同意這種說法。當(dāng)我寫

這篇文章時(shí),為了確定語法的正確性,我的確查了一下書??墒钱?dāng)我被面試的時(shí)候,我期望

被問到這個(gè)問題(或者相近的問題)。因?yàn)樵诒幻嬖嚨倪@段時(shí)間里,我確定我知道這個(gè)問題

的答案。應(yīng)試者如果不知道所有的答案(或至少大部分答案),那么也就沒有為這次面試做

準(zhǔn)備,如果該面試者沒有為這次面試做準(zhǔn)備,那么她又能為什么出準(zhǔn)備呢?

Static

6.

關(guān)鍵字static的作用是什么?

這個(gè)簡(jiǎn)單的問題很少有人能回答完全。在C語言中,關(guān)鍵字static有三個(gè)明顯的作用:

在函數(shù)體,一個(gè)被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過程中維持其值不變。

在模塊內(nèi)(但在函數(shù)體外),一個(gè)被聲明為靜態(tài)的變量能夠被模塊內(nèi)所用函數(shù)訪

問,但不能被模塊外其它函數(shù)訪問。它是一個(gè)本地的全局變量。

在模塊內(nèi),一個(gè)被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。那就是

,這個(gè)函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。

大多數(shù)應(yīng)試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三

部分。這是一個(gè)應(yīng)試者的嚴(yán)重的缺點(diǎn),因?yàn)樗@然不懂得本地化數(shù)據(jù)和代碼范圍的好處和重

要性。

7.關(guān)鍵字const有什么含意?

我只要一聽到被面試者說:“const意味著常數(shù)”,我就知道我正在和一個(gè)業(yè)余者打交道。

去年Dan

Saks已經(jīng)在她的文章里完全概括了const的所有用法,因此ESP(譯者:Embedded

Systems

Programming)的每一位讀者應(yīng)該非常熟悉const能做什么和不能做什么.如果你從沒有

讀到那篇文章,只要能說出const意味著“只讀”就能夠了。盡管這個(gè)答案不是完全的答案

,但我接受它作為一個(gè)正確的答案。(如果你想知道更詳細(xì)的答案,仔細(xì)讀一下Saks的文章

吧。)

如果應(yīng)試者能正確回答這個(gè)問題,我將問她一個(gè)附加的問題:

下面的聲明都是什么意思?

const

int

a;

int

const

a;

const

int

*a;

int

*

const

a;

int

const

*

a

const;

/******/

前兩個(gè)的作用是一樣,a是一個(gè)常整型數(shù)。第三個(gè)意味著a是一個(gè)指向常整型數(shù)的指針(也就

是,整型數(shù)是不可修改的,但指針能夠)。第四個(gè)意思a是一個(gè)指向整型數(shù)的常指針(也就

是說,指針指向的整型數(shù)是能夠修改的,但指針是不可修改的)。最后一個(gè)意味著a是一個(gè)

指向常整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是不可修改的,同時(shí)指針也是不可修改的)。如果應(yīng)試者能正確回答這些問題,那么她就給我留下了一個(gè)好印象。順帶提一句,

可能你可能會(huì)問,即使不用關(guān)鍵字const,也還是能很容易寫出功能正確的程序,那么我為

什么還要如此看重關(guān)鍵字const呢?我也如下的幾下理由:

關(guān)鍵字const的作用是為給讀你代碼的人傳達(dá)非常有用的信息,實(shí)際上,聲明一個(gè)

參數(shù)為常量是為了告訴了用戶這個(gè)參數(shù)的應(yīng)用目的。如果你曾花很多時(shí)間清理其它人留下的

垃圾,你就會(huì)很快學(xué)會(huì)感謝這點(diǎn)多余的信息。(當(dāng)然,懂得用const的程序員很少會(huì)留下的

垃圾讓別人來清理的。)

經(jīng)過給優(yōu)化器一些附加的信息,使用關(guān)鍵字const可能能產(chǎn)生更緊湊的代碼。

合理地使用關(guān)鍵字const能夠使編譯器很自然地保護(hù)那些不希望被改變的參數(shù),防

止其被無意的代碼修改。簡(jiǎn)而言之,這樣能夠減少bug的出現(xiàn)。

Volatile

8.

關(guān)鍵字volatile有什么含意?并給出三個(gè)不同的例子。

一個(gè)定義為volatile的變量是說這變量可能會(huì)被意想不到地改變,這樣,編譯器就不會(huì)去假設(shè)這個(gè)變量的值了。精確地說就是,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這

個(gè)變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個(gè)例子:

并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)

一個(gè)中斷服務(wù)子程序中會(huì)訪問到的非自動(dòng)變量(Non‐automatic

variables)

多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量

回答不出這個(gè)問題的人是不會(huì)被雇傭的。我認(rèn)為這是區(qū)分C程序員和嵌入式系統(tǒng)程序員的最

基本的問題。搞嵌入式的家伙們經(jīng)常同硬件、中斷、RTOS等等打交道,所有這些都要求用到

volatile變量。不懂得volatile的內(nèi)容將會(huì)帶來災(zāi)難。

假設(shè)被面試者正確地回答了這是問題(嗯,懷疑是否會(huì)是這樣),我將稍微深究一下,看一

下這家伙是不是直正懂得volatile完全的重要性。

一個(gè)參數(shù)既能夠是const還能夠是volatile嗎?解釋為什么。

一個(gè)指針能夠是volatile

嗎?解釋為什么。

下面的函數(shù)有什么錯(cuò)誤:

int

square(volatile

int

*ptr)

{

return

*ptr

*

*ptr;

}

下面是答案:

是的。一個(gè)例子是只讀的狀態(tài)寄存器。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗?/p>

變。它是const因?yàn)槌绦虿粦?yīng)該試圖去修改它。

是的。盡管這并不很常見。一個(gè)例子是當(dāng)一個(gè)中服務(wù)子程序修該一個(gè)指向一個(gè)buffer的指針時(shí)。

這段代碼有點(diǎn)變態(tài)。這段代碼的目的是用來返指針*ptr指向值的平方,可是,由于*ptr指向一個(gè)volatile型參數(shù),編譯器將產(chǎn)生類似下面的代碼:

int

square(volatile

int

*ptr)

{

int

a,b;

a

=

*ptr;

b

=

*ptr;

return

a

*

b;

}

由于*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結(jié)果,這段代碼可能返不是

你所期望的平方值!正確的代碼如下:

long

square(volatile

int

*ptr)

{

int

a;

a

=

*ptr;

return

a

*

a;

}

位操作(Bit

manipulation)

9.

嵌入式系統(tǒng)總是要用戶對(duì)變量或寄存器進(jìn)行位操作。給定一個(gè)整型變量a,寫兩段代碼,

第一個(gè)設(shè)置a的bit

3,第二個(gè)清除a

的bit

3。在以上兩個(gè)操作中,要保持其它位不變。

對(duì)這個(gè)問題有三種基本的反應(yīng)

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

用bit

fields。

Bit

fields是被扔到C語言死角的東西,它保證你的代碼在不同編

譯器之間是不可移植的,同時(shí)也保證了的你的代碼是不可重用的。我最近不幸看到Infineon為其較復(fù)雜的通信芯片寫的驅(qū)動(dòng)程序,它用到了bit

fields因此完全對(duì)我無用,因?yàn)槲业木幾g器用其它的方式來實(shí)現(xiàn)bit

fields的。從道德講:永遠(yuǎn)不要讓一個(gè)非嵌入式的家伙粘實(shí)際硬件的邊。用

#defines

bit

masks

操作。這是一個(gè)有極高可移植性的方法,是應(yīng)該被用

到的方法。最佳的解決方案如下:

#define

BIT3

(0x1

<<

3)

static

int

a;

void

set_bit3(void)

{

a

|=

BIT3;

}

void

clear_bit3(void)

{

a

&=

~BIT3;

}

一些人喜歡為設(shè)置和清除值而定義一個(gè)掩碼同時(shí)定義一些說明常數(shù),這也是能夠接受的。我

希望看到幾個(gè)要點(diǎn):說明常數(shù)、|=和&=~操作。

訪問固定的內(nèi)存位置(Accessing

fixed

memory

locations)

10.

嵌入式系統(tǒng)經(jīng)常具有要求程序員去訪問某特定的內(nèi)存位置的特點(diǎn)。在某工程中,要求設(shè)置一絕對(duì)地址為0x67a9的整型變量的值為0xaa66。編譯器是一個(gè)純粹的ANSI編譯器。寫代碼

去完成這一任務(wù)。

這一問題測(cè)試你是否知道為了訪問一絕對(duì)地址把一個(gè)整型數(shù)強(qiáng)制轉(zhuǎn)換(typecast)為一指針

是合法的。這一問題的實(shí)現(xiàn)方式隨著個(gè)人風(fēng)格不同而不同。典型的類似代碼如下:

int

*ptr;

ptr

=

(int

*)0x67a9;

*ptr

=

0xaa55;

A

more

obscure

approach

is:

一個(gè)較晦澀的方法是:

*(int

*

const)(0x67a9)

=

0xaa55;

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

中斷(Interrupts)

11.

中斷是嵌入式系統(tǒng)中重要的組成部分,這導(dǎo)致了很多編譯開發(fā)商提供一種擴(kuò)展—讓標(biāo)準(zhǔn)

C支持中斷。具代表事實(shí)是,產(chǎn)生了一個(gè)新的關(guān)鍵字__interrupt。下面的代碼就使用了__in

terrupt關(guān)鍵字去定義了一個(gè)中斷服務(wù)子程序(ISR),請(qǐng)?jiān)u論一下這段代碼的。

__interrupt

double

compute_area

(double

radius)

{

double

area

=

PI

*

radius

*

radius;

printf("\nArea

=

%f",

area);

return

area;

}

這個(gè)函數(shù)有太多的錯(cuò)誤了,以至讓人不知從何說起了:

ISR不能返回一個(gè)值。如果你不懂這個(gè),那么你不會(huì)被雇用的。

ISR不能傳遞參數(shù)。如果你沒有看到這一點(diǎn),你被雇用的機(jī)會(huì)等同第一項(xiàng)。

在許多的處理器/編譯器中,浮點(diǎn)一般都是不可重入的。有些處理器/編譯器需要

讓額處的寄存器入棧,有些處理器/編譯器就是不允許在ISR中做浮點(diǎn)運(yùn)算。另外,ISR應(yīng)該

是短而有效率的,在ISR中做浮點(diǎn)運(yùn)算是不明智的。

與第三點(diǎn)一脈相承,printf()經(jīng)常有重入和性能上的問題。如果你丟掉了第三和

第四點(diǎn),我不會(huì)太為難你的。不用說,如果你能得到后兩點(diǎn),那么你的被雇用前景越來越光

明了。

*****

代碼例子(Code

examples)

12

.

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

void

foo(void)

{

unsigned

int

a

=

6;

int

b

=

‐20;

(a+b

>

6)

?

puts(">

6")

:

puts("<=

6");

}

這個(gè)問題測(cè)試你是否懂得C語言中的整數(shù)自動(dòng)轉(zhuǎn)換原則,我發(fā)現(xiàn)有些開發(fā)者懂得極少這些東

西。不論如何,這無符號(hào)整型問題的答案是輸出是

”>6”。原因是當(dāng)表示式中存在有符號(hào)

類型和無符號(hào)類型時(shí)所有的操作數(shù)都自動(dòng)轉(zhuǎn)換為無符號(hào)類型。

因此‐20變成了一個(gè)非常大的

正整數(shù),因此該表示式計(jì)算出的結(jié)果大于6。這一點(diǎn)對(duì)于應(yīng)當(dāng)頻繁用到無符號(hào)數(shù)據(jù)類型的嵌

入式系統(tǒng)來說是豐常重要的。如果你答錯(cuò)了這個(gè)問題,你也就到了得不到這份工作的邊緣。

13.

評(píng)價(jià)下面的代碼片斷:

unsigned

int

zero

=

0;

unsigned

int

compzero

=

0xFFFF;

/*1's

complement

of

zero

*/

對(duì)于一個(gè)int型不是16位的處理器為說,上面的代碼是不正確的。應(yīng)編寫如下:

unsigned

int

compzero

=

~0;

這一問題真正能揭露出應(yīng)試者是否懂得處理器字長(zhǎng)的重要性。在我的經(jīng)驗(yàn)里,好的嵌入式程

序員非常準(zhǔn)確地明白硬件的細(xì)節(jié)和它的局限,然而PC機(jī)程序往往把硬件作為一個(gè)無法避免的

煩惱。

到了這個(gè)階段,應(yīng)試者或者完全垂頭喪氣了或者信心滿滿志在必得。如果顯然應(yīng)試者不是很

好,那么這個(gè)測(cè)試就在這里結(jié)束了。但如果顯然應(yīng)試者做得不錯(cuò),那么我就扔出下面的追加

問題,這些問題是比較難的,我想僅僅非常優(yōu)秀的應(yīng)試者能做得不錯(cuò)。提出這些問題,我希

望更多看到應(yīng)試者應(yīng)付問題的方法,而不是答案。不論如何,你就當(dāng)是這個(gè)娛樂吧…

動(dòng)態(tài)內(nèi)存分配(Dynamic

memory

allocation)

14.

盡管不像非嵌入式計(jì)算機(jī)那么常見,嵌入式系統(tǒng)還是有從堆(heap)中動(dòng)態(tài)分配內(nèi)存的

過程的。那么嵌入式系統(tǒng)中,動(dòng)態(tài)分配內(nèi)存可能發(fā)生的問題是什么?

這里,我期望應(yīng)試者能提到內(nèi)存碎片,碎片收集的問題,變量的持行時(shí)間等等。這個(gè)主題已

經(jīng)在ESP雜志中被廣泛地討論過了(主要是

P.J.

Plauger,

她的解釋遠(yuǎn)遠(yuǎn)超過我這里能提到

的任何解釋),所有回過頭看一下這些雜志吧!讓應(yīng)試者進(jìn)入一種虛假的安全感覺后,我拿

出這么一個(gè)小節(jié)目:

下面的代碼片段的輸出是什么,為什么?

char

*ptr;

if

((ptr

=

(char

*)malloc(0))

==

NULL)

else

puts("Got

a

null

pointer");

puts("Got

a

valid

pointer");

這是一個(gè)有趣的問題。最近在我的一個(gè)同事不經(jīng)意把0值傳給了函數(shù)malloc,得到了一個(gè)合

法的指針之后,我才想到這個(gè)問題。這就是上面的代碼,該代碼的輸出是“Got

a

valid

pointer”。我用這個(gè)來開始討論這樣的一問題,看看被面試者是否想到庫(kù)例程這樣做是正確

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

Typedef

:

15

Typedef

在C語言中頻繁用以聲明一個(gè)已經(jīng)存在的數(shù)據(jù)類型的同義字。也能夠用預(yù)處理器

做類似的事。例如,思考一下下面的例子:

#define

dPS

struct

s

*

typedef

struct

s

*

tPS;

以上兩種情況的意圖都是要定義dPS

tPS

作為一個(gè)指向結(jié)構(gòu)s指針。哪種方法更好呢?(

如果有的話)為什么?

這是一個(gè)非常微妙的問題,任何人答對(duì)這個(gè)問題(正當(dāng)?shù)脑颍┦菓?yīng)當(dāng)被恭喜的。答案是:

typedef更好。思考下面的例子:

dPS

p1,p2;

tPS

p3,p4;

第一個(gè)擴(kuò)展為

struct

s

*

p1,

p2;

上面的代碼定義p1為一個(gè)指向結(jié)構(gòu)的指,p2為一個(gè)實(shí)際的結(jié)構(gòu),這可能不是你想要的。第二

個(gè)例子正確地定義了p3

和p4

兩個(gè)指針。

晦澀的語法

16

.

C語言同意一些令人震驚的結(jié)構(gòu),下面的結(jié)構(gòu)是合法的嗎,如果是它做些什么?

int

a

=

5,

b

=

7,

c;

c

=

a+++b;

這個(gè)問題將做為這個(gè)測(cè)驗(yàn)的一個(gè)愉快的結(jié)尾。不論你相不相信,上面的例子是完全合乎語法

的。問題是編譯器如何處理它?水平不高的編譯作者實(shí)際上會(huì)爭(zhēng)論這個(gè)問題,根據(jù)最處理原

則,編譯器應(yīng)當(dāng)能處理盡可能所有合法的用法。因此,上面的代碼被處理成:

c

=

a++

+

b;

因此,

這段代碼持行后a

=

6,

b

=

7,

c

=

12。

如果你知道答案,或猜出正確答案,做得好。如果你不知道答案,我也不把這個(gè)當(dāng)作問題。

我發(fā)現(xiàn)這個(gè)問題的最大好處是這是一個(gè)關(guān)于代碼編寫風(fēng)格,代碼的可讀性,代碼的可修改性的好的話題.

嵌入式系統(tǒng)C語言基礎(chǔ)題預(yù)處理器(Preprocessor)1、用預(yù)處理指令#define聲明一個(gè)常數(shù),用以表明1年中有多少秒(忽略閏年問題)#defineSECONDS_PER_YEAR(60*60*24*365)UL我在這想看到幾件事情:1)#define語法的基本知識(shí)(例如:不能以分號(hào)結(jié)束,括號(hào)的使用,等等)2)懂得預(yù)處理器將為你計(jì)算常數(shù)表示式的值,因此,直接寫出你是如何計(jì)算一年中有多少秒而不是計(jì)算出實(shí)際的值,是更清晰而沒有代價(jià)的。3)意識(shí)到這個(gè)表示式將使一個(gè)16位機(jī)的整型數(shù)溢出——因此要用到長(zhǎng)整型符號(hào)L,告訴編譯器這個(gè)常數(shù)是的長(zhǎng)整型數(shù)。4)如果你在你的表示式中用到UL(表示無符號(hào)長(zhǎng)整型),那么你有了一個(gè)好的起點(diǎn)。記住,第一印象很重要。2、寫一個(gè)“標(biāo)準(zhǔn)”宏MIN,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)。#defineMIN(A,B)((A)<=(B)?(A):(B))這個(gè)測(cè)試是為下面的目的而設(shè)的:1)標(biāo)識(shí)#define在宏中應(yīng)用的基本知識(shí)。這是很重要的,因?yàn)橹狼度?inline)操作符變?yōu)闃?biāo)準(zhǔn)C的一部分,宏是方便產(chǎn)生嵌入代碼的唯一方法,對(duì)于嵌入式系統(tǒng)來說,為了能達(dá)到要求的性能,嵌入代碼經(jīng)常是必須的方法。2)三重條件操作符的知識(shí)。這個(gè)操作符存在C語言中的原因是它使得編譯器能產(chǎn)生比if-then-else更優(yōu)化的代碼,了解這個(gè)用法是很重要的。3)懂得在宏中小心地把參數(shù)用括號(hào)括起來。4)我也用這個(gè)問題開始討論宏的副作用,例如:當(dāng)你寫下面的代碼時(shí)會(huì)發(fā)生什么事?least=MIN(*p++,b);3、預(yù)處理器標(biāo)識(shí)#error的目的是什么?#error停止編譯并顯示錯(cuò)誤信息這問題對(duì)區(qū)分一個(gè)正常的家伙和一個(gè)書呆子是很有用的。只有書呆子才會(huì)讀C語言課本的附錄去找出像這種問題的答案。當(dāng)然如果你不是在找一個(gè)書呆子,那么應(yīng)試者最好希望自己不要知道答案。死循環(huán)(Infiniteloops)4、嵌入式系統(tǒng)中經(jīng)常要用到無限循環(huán),你怎么樣用C編寫死循環(huán)呢?這個(gè)問題用幾個(gè)解決方案。我首選的方案是:while(1){}一些程序員更喜歡如下方案:for(;;){}這個(gè)實(shí)現(xiàn)方式讓我為難,因?yàn)檫@個(gè)語法沒有確切表示到底怎么回事。如果一個(gè)應(yīng)試者給出這個(gè)作為方案,我將用這個(gè)作為一個(gè)機(jī)會(huì)去探究她們這樣做的基本原理。如果她們的基本答案是:“我被教著這樣做,但從沒有想到過為什么?!边@會(huì)給我留下一個(gè)壞印象。第三個(gè)方案是用gotoLoop:...gotoLoop;應(yīng)試者如給出上面的方案,這說明或者她是一個(gè)匯編語言程序員(這可能是好事)或者她是一個(gè)想進(jìn)入新領(lǐng)域的BASIC/FORTRAN程序員。數(shù)據(jù)聲明(Datadeclarations)5、用變量a給出下面的定義a)一個(gè)整型數(shù)(Aninteger)b)一個(gè)指向整型數(shù)的指針(Apointertoaninteger)c)一個(gè)指向指針的的指針,它指向的指針是指向一個(gè)整型數(shù)(Apointertoapointertoaninteger)d)一個(gè)有10個(gè)整型數(shù)的數(shù)組(Anarrayof10integers)e)一個(gè)有10個(gè)指針的數(shù)組,該指針是指向一個(gè)整型數(shù)的(Anarrayof10pointerstointegers)f)一個(gè)指向有10個(gè)整型數(shù)數(shù)組的指針(Apointertoanarrayof10integers)g)一個(gè)指向函數(shù)的指針,該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)(Apointertoafunctionthattakesanintegerasanargumentandreturnsaninteger)h)一個(gè)有10個(gè)指針的數(shù)組,該指針指向一個(gè)函數(shù),該函數(shù)有一個(gè)整型參數(shù)并返回一個(gè)整型數(shù)(Anarrayoftenpointerstofunctionsthattakeanintegerargumentandreturnaninteger)答案是:a)inta;//Anintegerb)int*a;//Apointertoanintegerc)int**a;//Apointertoapointertoanintegerd)inta[10];//Anarrayof10integerse)int*a[10];//Anarrayof10pointerstointegersf)int(*a)[10];//Apointertoanarrayof10integersg)int(*a)(int);//Apointertoafunctionathattakesanintegerargumentandreturnsanintegerh)int(*a[10])(int);//Anarrayof10pointerstofunctionsthattakeanintegerargumentandreturnaninteger人們經(jīng)常聲稱這里有幾個(gè)問題是那種要翻一下書才能回答的問題,我同意這種說法。當(dāng)我寫這篇文章時(shí),為了確定語法的正確性,我的確查了一下書??墒钱?dāng)我被面試的時(shí)候我期望被問到這個(gè)問題(或者相近的問題)。因?yàn)樵诒幻嬖嚨倪@段時(shí)間里,我確定我知道這個(gè)問題的答案。應(yīng)試者如果不知道所有問題的答案(或至少大部分答案),那么也就沒有為這次面試做準(zhǔn)備,如果該面試者沒有為這次面試做準(zhǔn)備,那么她又能為什么做出準(zhǔn)備呢?Static6、關(guān)鍵字static的作用是什么?在C語言中,關(guān)鍵字static有三個(gè)明顯的作用:1).在函數(shù)體,一個(gè)被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過程中維持其值不變。2).在模塊內(nèi)(但在函數(shù)體外),一個(gè)被聲明為靜態(tài)的變量能夠被模塊內(nèi)所用函數(shù)訪問,但不能被模塊外其它函數(shù)訪問。它是一個(gè)本地的全局變量。3).在模塊內(nèi),一個(gè)被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。那就是,這個(gè)函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。大多數(shù)應(yīng)試者能正確回答第一部分,一部分能正確回答第二部分,同是很少的人能懂得第三部分。這是一個(gè)應(yīng)試者的嚴(yán)重的缺點(diǎn),因?yàn)樗@然不懂得本地化數(shù)據(jù)和代碼范圍的好處和重要性。Const7、關(guān)鍵字const是什么含意?我只要一聽到被面試者說:“const意味著常數(shù)”,我就知道我正在和一個(gè)業(yè)余者打交道。去年DanSaks已經(jīng)在她的文章里完全概括了const的所有用法,因此ESP(譯者:EmbeddedSystemsProgramming)的每一位讀者應(yīng)該非常熟悉const能做什么和不能做什么。如果你從沒有讀到那篇文章,只要能說出const意味著“只讀”就能夠了。盡管這個(gè)答案不是完全的答案,但我接受它作為一個(gè)正確的答案。(如果你想知道更詳細(xì)的答案,仔細(xì)讀一下Saks的文章吧。)如果應(yīng)試者能正確回答這個(gè)問題,我將問她一個(gè)附加的問題:下面的聲明都是什么意思?constinta;intconsta;constint*a;int*consta;intconst*aconst;前兩個(gè)的作用是一樣,a是一個(gè)常整型數(shù)。第三個(gè)意味著a是一個(gè)指向常整型數(shù)的指針(也就是,整型數(shù)是不可修改的,但指針能夠)。第四個(gè)意思a是一個(gè)指向整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是能夠修改的,但指針是不可修改的)。最后一個(gè)意味著a是一個(gè)指向常整型數(shù)的常指針(也就是說,指針指向的整型數(shù)是不可修改的,同時(shí)指針也是不可修改的)。如果應(yīng)試者能正確回答這些問題,那么她就給我留下了一個(gè)好印象。順帶提一句,可能你可能會(huì)問,即使不用關(guān)鍵字const,也還是能很容易寫出功能正確的程序,那么我為什么還要如此看重關(guān)鍵字const呢?我也如下的幾下理由:1)關(guān)鍵字const的作用是為給讀你代碼的人傳達(dá)非常有用的信息,實(shí)際上,聲明一個(gè)參數(shù)為常量是為了告訴了用戶這個(gè)參數(shù)的應(yīng)用目的。如果你曾花很多時(shí)間清理其它人留下的垃圾,你就會(huì)很快學(xué)會(huì)感謝這點(diǎn)多余的信息。(當(dāng)然,懂得用const的程序員很少會(huì)留下的垃圾讓別人來清理的。)2)經(jīng)過給優(yōu)化器一些附加的信息,使用關(guān)鍵字const可能能產(chǎn)生更緊湊的代碼。3)合理地使用關(guān)鍵字const能夠使編譯器很自然地保護(hù)那些不希望被改變的參數(shù),防止其被無意的代碼修改。簡(jiǎn)而言之,這樣能夠減少bug的出現(xiàn)。Volatile8、關(guān)鍵字volatile有什么含意并給出三個(gè)不同的例子。一個(gè)定義為volatile的變量是說這變量可能會(huì)被意想不到地改變,這樣,編譯器就不會(huì)去假設(shè)這個(gè)變量的值了。精確地說就是,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個(gè)例子:1).并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器)2).一個(gè)中斷服務(wù)子程序中會(huì)訪問到的非自動(dòng)變量(Non-automaticvariables)3).多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量回答不出這個(gè)問題的人是不會(huì)被雇傭的。我認(rèn)為這是區(qū)分C程序員和嵌入式系統(tǒng)程序員的最基本的問題。嵌入式系統(tǒng)程序員經(jīng)常同硬件、中斷、RTOS等等打交道,所用這些都要求volatile變量。1).一個(gè)參數(shù)既能夠是const還能夠是volatile嗎?解釋為什么。2).一個(gè)指針能夠是volatile嗎?解釋為什么。3).下面的函數(shù)有什么錯(cuò)誤:intsquare(volatileint*ptr){return*ptr**ptr;}下面是答案:1).是的。一個(gè)例子是只讀的狀態(tài)寄存器。它是volatile因?yàn)樗赡鼙灰庀氩坏降馗淖儭K莄onst因?yàn)槌绦虿粦?yīng)該試圖去修改它。2).是的。盡管這并不很常見。一個(gè)例子是當(dāng)一個(gè)中斷服務(wù)子程序修改一個(gè)指向一個(gè)buffer的指針時(shí)。3).這段代碼的有個(gè)惡作劇。這段代碼的目的是用來返指針*ptr指向值的平方,可是,由于*ptr指向一個(gè)volatile型參數(shù),編譯器將產(chǎn)生類似下面的代碼:intsquare(volatileint*ptr){inta,b;a=*ptr;b=*ptr;returna*b;}由于*ptr的值可能被意想不到地該變,因此a和b可能是不同的。結(jié)果,這段代碼可能返不是你所期望的平方值!正確的代碼如下:longsquare(volatileint*ptr){inta;a=*ptr;returna*a;}位操作(Bitmanipulation)9、嵌入式系統(tǒng)總是要用戶對(duì)變量或寄存器進(jìn)行位操作。給定一個(gè)整型變量a,寫兩段代碼,第一個(gè)設(shè)置a的bit3,第二個(gè)清除a的bit3。在以上兩個(gè)操作中,要保持其它位不變。對(duì)這個(gè)問題有三種基本的反應(yīng):1).不知道如何下手。該被面者從沒做過任何嵌入式系統(tǒng)的工作。2).用bitfields。Bitfields是被扔到C語言死角的東西,它保證你的代碼在不同編譯器之間是不可移植的,同時(shí)也保證了的你的代碼是不可重用的。我最近不幸看到Infineon為其較復(fù)雜的通信芯片寫的驅(qū)動(dòng)程序,它用到了bitfields因此完全對(duì)我無用,因?yàn)槲业木幾g器是用其它的方式來實(shí)現(xiàn)bitfields的。從道德講:永遠(yuǎn)不要讓一個(gè)非嵌入式的家伙粘實(shí)際硬件的邊。3).用#defines和bitmasks操作。這是一個(gè)有極高可移植性的方法,是應(yīng)該被用到的方法。最佳的解決方案如下:#defineBIT3(0x1<<3)staticinta;voidset_bit3(void){a|=BIT3;}voidclear_bit3(void){a&=~BIT3;}一些人喜歡為設(shè)置和清除值而定義一個(gè)掩碼同時(shí)定義一些說明常數(shù),這也是能夠接受的。我希望看到幾個(gè)要點(diǎn):說明常數(shù)、|=和&=~操作。訪問固定的內(nèi)存位置(Accessingfixedmemorylocations)10、嵌入式系統(tǒng)經(jīng)常具有要求程序員去訪問某特定的內(nèi)存位置的特點(diǎn)。在某工程中,要求設(shè)置一絕對(duì)地址為0x67a9的整型變量的值為0xaa66。編譯器是一個(gè)純粹的ANSI編譯器。寫代碼去完成這一任務(wù)。這一問題測(cè)試你是否知道為了訪問一絕對(duì)地址把一個(gè)整型數(shù)強(qiáng)制轉(zhuǎn)換(typecast)為一指針是合法的。這一問題的實(shí)現(xiàn)方式隨著個(gè)人風(fēng)格不同而不同。典型的類似代碼如下:int*ptr;ptr=(int*)0x67a9;*ptr=0xaa55;一個(gè)較晦澀的方法是:*(int*const)(0x67a9)=0xaa55;即使你的品味更接近第二種方案,但我建議你在面試時(shí)使用第一種方案。中斷(Interrupts)11、中斷是嵌入式系統(tǒng)中重要的組成部分,這導(dǎo)致了很多編譯開發(fā)商提供一種擴(kuò)展——讓標(biāo)準(zhǔn)C支持中斷。具代表事實(shí)是,產(chǎn)生了一個(gè)新的關(guān)鍵字__interrupt。下面的代碼就使用了__interrupt關(guān)鍵字去定義了一個(gè)中斷服務(wù)子程序(ISR),請(qǐng)?jiān)u論一下這段代碼的。__interruptdoublecompute_area(doubleradius){doublearea=PI*radius*radius;printf("Area=%f",area);returnarea;}這個(gè)函數(shù)有太多的錯(cuò)誤了,以至讓人不知從何說起了:1).ISR不能返回一個(gè)值。如果你不懂這個(gè),那么你不會(huì)被雇用的。2).ISR不能傳遞參數(shù)。如果你沒有看到這一點(diǎn),你被雇用的機(jī)會(huì)等同第一項(xiàng)。3).在許多的處理器/編譯器中,浮點(diǎn)一般都是不可重入的。有些處理器/編譯器需要讓額處的寄存器入棧,有些處理器/編譯器就是不允許在ISR中做浮點(diǎn)運(yùn)算。另外,ISR應(yīng)該是短而有效率的,在ISR中做浮點(diǎn)運(yùn)算是不明智的。4).與第三點(diǎn)一脈相承,printf()經(jīng)常有重入和性能上的問題。如果你丟掉了第三和第四點(diǎn),我不會(huì)太為難你的。不用說,如果你能得到后兩點(diǎn),那么你的被雇用前景越來越光明了。代碼例子(Codeexamples)12、下面的代碼輸出是什么,為什么?voidfoo(void){unsignedinta=6;intb=-20;(a+b>6)?puts(">6"):puts("<=6");}這個(gè)問題測(cè)試你是否懂得C語言中的整數(shù)自動(dòng)轉(zhuǎn)換原則,我發(fā)現(xiàn)有些開發(fā)者懂得極少這些東西。不論如何,這無符號(hào)整型問題的答案是輸出是“>6”。原因是當(dāng)表示式中存在有符號(hào)類型和無符號(hào)類型時(shí)所有的操作數(shù)都自動(dòng)轉(zhuǎn)換為無符號(hào)類型。因此-20變成了一個(gè)非常大的正整數(shù),因此該表示式計(jì)算出的結(jié)果大于6。這一點(diǎn)對(duì)于應(yīng)當(dāng)頻繁用到無符號(hào)數(shù)據(jù)類型的嵌入式系統(tǒng)來說是豐常重要的。如果你答錯(cuò)了這個(gè)問題,你也就到了得不到這份工作的邊緣。13、評(píng)價(jià)下面的代碼片斷:unsignedintzero=0;unsignedintcompzero=0xFFFF;對(duì)于一個(gè)int型不是16位的處理器為說,上面的代碼是不正確的。應(yīng)編寫如下:unsignedintcompzero=~0;這一問題真正能揭露出應(yīng)試者是否懂得處理器字長(zhǎng)的重要性。在我的經(jīng)驗(yàn)里,好的嵌入式程序員非常準(zhǔn)確地明白硬件的細(xì)節(jié)和它的局限,然而PC機(jī)程序往往把硬件作為一個(gè)無法避免的煩惱。到了這個(gè)階段,應(yīng)試者或者完全垂頭喪氣了或者信心滿滿志在必得。如果顯然應(yīng)試者不是很好,那么這個(gè)測(cè)試就在這里結(jié)束了。但如果顯然應(yīng)試者做得不錯(cuò),那么我就扔出下面的追加問題,這些問題是比較難的,我想僅僅非常優(yōu)秀的應(yīng)試者能做得不錯(cuò)。提出這些問題,我希望更多看到應(yīng)試者應(yīng)付問題的方法,而不是答案。不論如何,你就當(dāng)是這個(gè)娛樂吧…動(dòng)態(tài)內(nèi)存分配(Dynamicmemoryallocation)14、盡管不像非嵌入式計(jì)算機(jī)那么常見,嵌入式系統(tǒng)還是有從堆(heap)中動(dòng)態(tài)分配內(nèi)存的過程的。那么嵌入式系統(tǒng)中,動(dòng)態(tài)分配內(nèi)存可能發(fā)生的問題是什么?這里,我期望應(yīng)試者能提到內(nèi)存碎片,碎片收集的問題,變量的持行時(shí)間等等。這個(gè)主題已經(jīng)在ESP雜志中被廣泛地討論過了(主要是P.J.Plauger,她的解釋遠(yuǎn)遠(yuǎn)超過我這里能提到的任何解釋),所有回過頭看一下這些雜志吧!讓應(yīng)試者進(jìn)入一種虛假的安全感覺后,我拿出這么一個(gè)小節(jié)目:下面的代碼片段的輸出是什么,為什么?char*ptr;if((ptr=(char*)malloc(0))==NULL)puts("Gotanullpointer");elseputs("Gotavalidpointer");這是一個(gè)有趣的問題。最近在我的一個(gè)同事不經(jīng)意把0值傳給了函數(shù)malloc,得到了一個(gè)合法的指針之后,我才想到這個(gè)問題。這就是上面的代碼,該代碼的輸出是“Gotavalidpointer”。我用這個(gè)來開始討論這樣的一問題,看看被面試者是否想到庫(kù)例程這樣做是正確。得到正確的答案固然重要,但解決問題的方法和你做決定的基本原理更重要些。Typedef15、Typedef在C語言中頻繁用以聲明一個(gè)已經(jīng)存在的數(shù)據(jù)類型的同義字。也能夠用預(yù)處理器做類似的事。例如,思考一下下面的例子:#definedPSstructs*typedefstructs*tPS;以上兩種情況的意圖都是要定義dPS和tPS作為一個(gè)指向結(jié)構(gòu)s指針。哪種方法更好呢?(如果有的話)為什么?這是一個(gè)非常微妙的問題,任何人答對(duì)這個(gè)問題(正當(dāng)?shù)脑颍┦菓?yīng)當(dāng)被恭喜的。答案是:typedef更好。思考下面的例子:dPSp1,p2;tPSp3,p4;第一個(gè)擴(kuò)展為structs*p1,p2;上面的代碼定義p1為一個(gè)指向結(jié)構(gòu)的指針,p2為一個(gè)實(shí)際的結(jié)構(gòu),這可能不是你想要的。第二個(gè)例子正確地定義了p3和p4兩個(gè)指針?;逎恼Z法16、C語言同意一些令人震驚的結(jié)構(gòu),下面的結(jié)構(gòu)是合法的嗎,如果是它做些什么?inta=5,b=7,c;c=a+++b;這個(gè)問題將做為這個(gè)測(cè)驗(yàn)的一個(gè)愉快的結(jié)尾。不論你相不相信,上面的例子是完全合乎語法的。問題是編譯器如何處理它?水平不高的編譯作者實(shí)際上會(huì)爭(zhēng)論這個(gè)問題,根據(jù)最處理原則,編譯器應(yīng)當(dāng)能處理盡可能所有合法的用法。因此,上面的代碼被處理成:c=a+++b;因此,這段代碼執(zhí)行后a=6,b=7,c=12。著名企業(yè)經(jīng)典面試題(華為、中興、微軟、思科、惠通……)C語言面試題大匯總4.static有什么用途?(請(qǐng)至少說明兩種)1.限制變量的作用域(DL:使其只在定義的當(dāng)前文件中起作用,static是只能由與變量在同一個(gè)文件中定義的程序存取的全局變量。也就是說使全局變量成為文件的私有變量,以致其它文件不能夠經(jīng)過將它們定義為extern而存取這些變量。)2.設(shè)置變量的存儲(chǔ)域(DL:存儲(chǔ)在最開始的靜態(tài)存儲(chǔ)空間里面)7.引用與指針有什么區(qū)別?1)引用必須被初始化,指針不必。2)引用初始化以后不能被改變,指針能夠改變所指的對(duì)象。2)不存在指向空值的引用,可是存在指向空值的指針。8.描述實(shí)時(shí)系統(tǒng)的基本特性在特定時(shí)間內(nèi)完成特定的任務(wù),實(shí)時(shí)性與可靠性9.全局變量和局部變量在內(nèi)存中是否有區(qū)別?如果有,是什么區(qū)別?全局變量?jī)?chǔ)存在靜態(tài)數(shù)據(jù)庫(kù),局部變量在堆棧10.什么是平衡二叉樹?左右子樹都是平衡二叉樹且左右子樹的深度差值的絕對(duì)值不大于111.堆棧溢出一般是由什么原因?qū)е碌??沒有回收垃圾資源12.什么函數(shù)不能聲明為虛函數(shù)?constructor13.冒泡排序算法的時(shí)間復(fù)雜度是什么?O(n^2)14.寫出floatx與“零值”比較的if語句。if(x>0.000001&&x<-0.000001)16.Internet采用哪種網(wǎng)絡(luò)協(xié)議?該協(xié)議的主要層次結(jié)構(gòu)?tcp/ip應(yīng)用層/傳輸層/網(wǎng)絡(luò)層/數(shù)據(jù)鏈路層/物理層17.Internet物理地址和IP地址轉(zhuǎn)換采用什么協(xié)議?ARP(AddressResolutionProtocol)(地址解析協(xié)議)18.IP地址的編碼分為哪倆部分?IP地址由兩部分組成,網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)。不過是要和“子網(wǎng)掩碼”按位與上之后才能區(qū)分哪些是網(wǎng)絡(luò)位哪些是主機(jī)位。2.用戶輸入M,N值,從1至N開始順序循環(huán)數(shù)數(shù),每數(shù)到M輸出該數(shù)值,直至全部輸出。寫出C程序。循環(huán)鏈表,用取余操作做3.不能做switch()的參數(shù)類型是:switch的參數(shù)不能為實(shí)型。華為1、局部變量能否和全局變量重名?答:能,局部會(huì)屏蔽全局。要用全局變量,需要使用"::"局部變量能夠與全局變量同名,在函數(shù)內(nèi)引用這個(gè)變量時(shí),會(huì)用到同名的局部變量,而不會(huì)用到全局變量。對(duì)于有些編譯器而言,在同一個(gè)函數(shù)內(nèi)能夠定義多個(gè)同名的局部變量,比如在兩個(gè)循環(huán)體內(nèi)都定義一個(gè)同名的局部變量,而那個(gè)局部變量的作用域就在那個(gè)循環(huán)體內(nèi)2、如何引用一個(gè)已經(jīng)定義過的全局變量?答:extern(在使用該變量的地方還要定義一次,extern只相當(dāng)于聲明,且只能在函數(shù)體外定義)/static(在使用時(shí)不用定義,且作用域限制在當(dāng)前源文件,且只能在函數(shù)體內(nèi)重新賦值)能夠用引用頭文件的方式(必須用static聲明),也能夠用extern關(guān)鍵字,如果用引用頭文件方式來引用某個(gè)在頭文件中聲明的全局變理,假定你將那個(gè)變寫錯(cuò)了,那么在編譯期間會(huì)報(bào)錯(cuò),如果你用extern方式引用時(shí),假定你犯了同樣的錯(cuò)誤,那么在編譯期間不會(huì)報(bào)錯(cuò),而在連接期間報(bào)錯(cuò)3、全局變量可不能夠定義在可被多個(gè).C文件包含的頭文件中?為什么?答:能夠,在不同的C文件中以static形式來聲明同名全局變量。能夠在不同的C文件中聲明同名的全局變量,前提是其中只能有一個(gè)C文件中對(duì)此變量賦初值,此時(shí)連接不會(huì)出錯(cuò)4、語句for(;1;)有什么問題?它是什么意思?答:和while(1)相同。5、do……while和while……do有什么區(qū)別?答:前一個(gè)循環(huán)一遍再判斷,后一個(gè)判斷以后再循環(huán)6、請(qǐng)寫出下列代碼的輸出內(nèi)容#include<stdio.h>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,1201、static全局變量與普通的全局變量有什么區(qū)別?static局部變量和普通局部變量有什么區(qū)別?static函數(shù)與普通函數(shù)有什么區(qū)別?全局變量(外部變量)的說明之前再冠以static就構(gòu)成了靜態(tài)的全局變量。全局變量本身就是靜態(tài)存儲(chǔ)方式,靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲(chǔ)方式。這兩者在存儲(chǔ)方式上并無不同。這兩者的區(qū)別雖在于非靜態(tài)全局變量的作用域是整個(gè)源程序,當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),非靜態(tài)的全局變量在各個(gè)源文件中都是有效的。而靜態(tài)全局變量則限制了其作用域,即只在定義該變量的源文件內(nèi)有效,在同一源程序的其它源文件中不能使用它。由于靜態(tài)全局變量的作用域局限于一個(gè)源文件內(nèi),只能為該源文件內(nèi)的函數(shù)公用,因此可以避免在其它源文件中引起錯(cuò)誤。從以上分析能夠看出,把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲(chǔ)方式即改變了它的生存期(靜態(tài)局部變量在程序運(yùn)行結(jié)束釋放空間,而普通靜態(tài)局部變量在函數(shù)退出時(shí)釋放空間)。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使用范圍。static函數(shù)與普通函數(shù)作用域不同。僅在本文件。只在當(dāng)前源文件中使用的函數(shù)應(yīng)該說明為內(nèi)部函數(shù)(static),內(nèi)部函數(shù)應(yīng)該在當(dāng)前源文件中說明和定義。對(duì)于可在當(dāng)前源文件以外使用的函數(shù),應(yīng)該在一個(gè)頭文件中說明,要使用這些函數(shù)的源文件要包含這個(gè)頭文件(用static聲明的即內(nèi)部函數(shù),內(nèi)部函數(shù)指只能被本文件的其它函數(shù)所調(diào)用的函數(shù),內(nèi)部函數(shù)在C++實(shí)際上能夠經(jīng)過類名修飾符訪問其它均為外部函數(shù))static全局變量與普通的全局變量有什么區(qū)別:static全局變量只初使化一次,防止在其她文件單元中被引用;static局部變量和普通局部變量有什么區(qū)別:static局部變量只被初始化一次,下一次依據(jù)上一次結(jié)果值;static函數(shù)與普通函數(shù)有什么區(qū)別:static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個(gè)被調(diào)用中維持一份拷貝2、程序的局部變量存在于(堆棧)中,全局變量存在于(靜態(tài)區(qū))中,動(dòng)態(tài)申請(qǐng)數(shù)據(jù)存在于(堆)中。3、設(shè)有以下說明和定義:typedefunion{longi;intk[5];charc;}DATE;structdata{intcat;DATEcow;doubledog;}too;DATEmax;則語句printf("%d",sizeof(structdate)+sizeof(max));的執(zhí)行結(jié)果是:___52____答:DATE是一個(gè)union,變量公用空間.里面最大的變量類型是int[5],占用20個(gè)字節(jié).所以它的大小是20data是一個(gè)struct,每個(gè)變量分開占用空間.依次為int4+DATE20+double8=32.因此結(jié)果是20+32=52.當(dāng)然...在某些16位編輯器下,int可能是2字節(jié),那么結(jié)果是int2+DATE10+double8=204、隊(duì)列和棧有什么區(qū)別?隊(duì)列先進(jìn)先出,棧后進(jìn)先出5、寫出下列代碼的輸出內(nèi)容#include<stdio.h>intinc(inta){return(++a);}intmulti(int*a,int*b,int*c){return(*c=*a**b);}typedefint(FUNC1)(intin);typedefint(FUNC2)(int*,int*,int*);voidshow(FUNC2fun,intarg1,int*arg2){INCp=&inc;inttemp=p(arg1);fun(&temp,&arg1,arg2);printf("%d\n",*arg2);}main(){inta;show(multi,10,&a);return0;}答:1107、請(qǐng)找出下面代碼中的因此錯(cuò)誤說明:以下代碼是把一個(gè)字符串倒序,如“abcd”倒序后變?yōu)椤癲cba”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--!=0)11、d++=s--;12、printf("%s",dest);13、return0;14、}答:方法1:intmain(){char*src="hello,world";intlen=strlen(src);char*dest=(char*)malloc(len+1);//要為\0分配一個(gè)空間char*d=dest;char*s=&src[len-1];//指向最后一個(gè)字符while(len--!=0)*d++=*s--;*d=0;//尾部要加\0printf("%s\n",dest);free(dest);//使用完,應(yīng)當(dāng)釋放空間,以免造成內(nèi)存匯泄露return0;}方法2:#include<stdio.h>#include<string.h>main(){charstr[]="hello,world";intlen=strlen(str);chart;for(inti=0;i<len/2;i++){t=str[i];str[i]=str[len-i-1];str[len-i-1]=t;}printf("%s",str);return0;}1.-1,2,7,28,,126請(qǐng)問28和126中間那個(gè)數(shù)是什么?為什么?第一題的答案應(yīng)該是4^3-1=63規(guī)律是n^3-1(當(dāng)n為偶數(shù)0,2,4)n^3+1(當(dāng)n為奇數(shù)1,3,5)答案:632.用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列的功能?要求給出算法和思路!設(shè)2個(gè)棧為A,B,一開始均為空.入隊(duì):將新元素push入棧A;出隊(duì):(1)判斷棧B是否為空;(2)如果不為空,則將棧A中所有元素依次pop出并push到棧B;(3)將棧B的棧頂元素pop出;這樣實(shí)現(xiàn)的隊(duì)列入隊(duì)和出隊(duì)的平攤復(fù)雜度都還是O(1),比上面的幾種方法要好。3.在c語言庫(kù)函數(shù)中將一個(gè)字符轉(zhuǎn)換成整型的函數(shù)是atool()嗎,這個(gè)函數(shù)的原型是什么?函數(shù)名:atol功能:把字符串轉(zhuǎn)換成長(zhǎng)整型數(shù)用法:longatol(constchar*nptr);程序例:#include<stdlib.h>#include<stdio.h>intmain(void){longl;char*str="98765432";l=atol(lstr);printf("string=%sinteger=%ld\n",str,l);return(0);}2.對(duì)于一個(gè)頻繁使用的短小函數(shù),在C語言中應(yīng)用什么實(shí)現(xiàn),在C++中應(yīng)用什么實(shí)現(xiàn)?c用宏定義,c++用inline3.直接鏈接兩個(gè)信令點(diǎn)的一組鏈路稱作什么?PPP點(diǎn)到點(diǎn)連接4.接入網(wǎng)用的是什么接口?DL:接入網(wǎng)在接入這些網(wǎng)絡(luò)時(shí),一般采用E1、V.24、V.35、2B1Q“U”接口,其余類型的接口使用較少。5.voip都用了那些協(xié)議?VoIP使用IETF會(huì)話發(fā)起協(xié)議(SIP)和實(shí)時(shí)傳輸協(xié)議(RTP)提交呼叫信令和語音消息與VoIP相關(guān)的網(wǎng)絡(luò)技術(shù)協(xié)議很多,常見的有控制實(shí)時(shí)數(shù)據(jù)流應(yīng)用在IP網(wǎng)絡(luò)傳輸?shù)腞TP(實(shí)時(shí)傳輸協(xié)議)和RTCP(實(shí)時(shí)傳輸控制協(xié)議);有保證網(wǎng)絡(luò)QoS質(zhì)量服務(wù)的RSVP(資源預(yù)留協(xié)議)和IPdifferentService等,還有傳統(tǒng)語音數(shù)字化編碼的一系列協(xié)議如G.711、G.728、G.723、G.729等等。但當(dāng)前VoIP技術(shù)最常見的話音建立和控制信令是H.323和SIP(會(huì)話初始協(xié)議)。6.軟件測(cè)試都有那些種類?黑盒:針對(duì)系統(tǒng)功能的測(cè)試白合:測(cè)試函數(shù)功能,各函數(shù)接口7.確定模塊的功能和模塊的接口是在軟件設(shè)計(jì)的那個(gè)隊(duì)段完成的?8.enumstring{x1,x2,x3=10,x4,x5,}x;問x=0x801005,0x8010f4;9.unsignedchar*p1;unsignedlong*p2;p1=(unsignedchar*)0x801000;p2=(unsignedlong*)0x810000;請(qǐng)問p1+5=0x801005;p2+5=0x810014(加5*4=20字節(jié),16進(jìn)制為0x14);三.選擇題:1.Ethternet鏈接到Internet用到以下那個(gè)協(xié)議?A.HDLC;B.ARP;C.UDP;D.TCP;E.ID2.屬于網(wǎng)絡(luò)層協(xié)議的是:A.TCP;B.IP;C.ICMP;D.X.253.Windows消息調(diào)度機(jī)制是:A.指令隊(duì)列;B.指令堆棧;C.消息隊(duì)列;D.消息堆棧;4.unsignedshorthash(unsignedshortkey){return(key>>)%256}請(qǐng)問hash(16),hash(256)的值分別是:A.1.16;B.8.32;C.4.16;D.1.32四.找錯(cuò)題:1.請(qǐng)問下面程序有什么錯(cuò)誤?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]=0;把循環(huán)語句內(nèi)外換一下(DL:換一下仿佛還是有錯(cuò))2.#defineMax_CB500voidLmiQueryCSmd(StructMSgCB*pmsg){unsignedcharucCmdNum;......for(ucCmdNum=0;ucCmdNum<Max_CB;ucCmdNum++){......;}死循環(huán)3.以下是求一個(gè)數(shù)的平方的程序,請(qǐng)找出錯(cuò)誤:#defineSQUARE(a)((a)*(a))inta=5;intb;b=SQUARE(a++);4.typedefunsignedcharBYTEintexamply_fun(BYTEgt_len;BYTE*gt_code){BYTE*gt_buf;gt_buf=(BYTE*)MALLOC(Max_GT_Length);......if(gt_len>Max_GT_Length){returnGT_Length_ERROR;}.......}五.問答題:1.IPPhone的原理是什么?IPV62.TCP/IP通信建立的過程怎樣,端口有什么作用?三次握手,確定是哪個(gè)應(yīng)用程序使用該協(xié)議3.1號(hào)信令和7號(hào)信令有什么區(qū)別,中國(guó)某前廣泛使用的是那一種?七號(hào)信令網(wǎng)是電話網(wǎng)、智能網(wǎng)以及各種新業(yè)務(wù)的神經(jīng)和支撐網(wǎng),是通信網(wǎng)建設(shè)維護(hù)的重要部分。根據(jù)中國(guó)七號(hào)信令技術(shù)體制要求,中國(guó)七號(hào)信令網(wǎng)最終采用三級(jí)準(zhǔn)直聯(lián)結(jié)構(gòu)方式。1號(hào)信令利用TS16傳送時(shí)。每個(gè)TS16負(fù)責(zé)傳送兩個(gè)話路的線路信令,TS16和話路有著固定的一一對(duì)應(yīng)關(guān)系。而7號(hào)信令利用TS16來傳送時(shí),只是將組成信令單元的若干個(gè)8位位組,依次插入TS16,TS16并不知道傳送的內(nèi)容,即信令和話路沒有固定關(guān)系,只不過利用TS16作為傳送信令的載體,時(shí)傳送信令消息的數(shù)據(jù)鏈路,因此,選用哪個(gè)時(shí)隙做數(shù)據(jù)鏈路均可。---這也是隨路信令和公共信道信令的一個(gè)本質(zhì)區(qū)別。4.列舉5種以上的電話新業(yè)務(wù)?微軟亞洲技術(shù)中心的面試題?。?!1.進(jìn)程和線程的差別。線程是指進(jìn)程內(nèi)的一個(gè)執(zhí)行單元,也是進(jìn)程內(nèi)的可調(diào)度實(shí)體.與進(jìn)程的區(qū)別:(1)調(diào)度:線程作為調(diào)度和分配的基本單位,進(jìn)程作為擁有資源的基本單位(2)并發(fā)性:不但進(jìn)程之間能夠并發(fā)執(zhí)行,同一個(gè)進(jìn)程的多個(gè)線程之間也可并發(fā)執(zhí)行(3)擁有資源:進(jìn)程是擁有資源的一個(gè)獨(dú)立單位,線程不擁有系統(tǒng)資源,但能夠訪問隸屬于進(jìn)程的資源.(4)系統(tǒng)開銷:在創(chuàng)立或撤消進(jìn)程時(shí),由于系統(tǒng)都要為之分配和回收資源,導(dǎo)致系統(tǒng)的開銷明顯大于創(chuàng)立或撤消線程時(shí)的開銷。2.測(cè)試方法人工測(cè)試:個(gè)人復(fù)查、抽查和會(huì)審機(jī)器測(cè)試:黑盒測(cè)試和白盒測(cè)試2.Heap與stack的差別。Heap是堆,stack是棧。Stack的空間由操作系統(tǒng)自動(dòng)分配/釋放,Heap上的空間手動(dòng)分配/釋放。Stack空間有限,Heap是很大的自由存儲(chǔ)區(qū)C中的malloc函數(shù)分配的內(nèi)存空間即在堆上,C++中對(duì)應(yīng)的是new操作符。程序在編譯期對(duì)變量和函數(shù)分配內(nèi)存都在棧上進(jìn)行,且程序運(yùn)行過程中函數(shù)調(diào)用時(shí)參數(shù)的傳遞也在棧上進(jìn)行3.Windows下的內(nèi)存是如何管理的?4.介紹.Net和.Net的安全性。5.客戶端如何訪問.Net組件實(shí)現(xiàn)WebService?6.C/C++編譯器中虛表是如何完成的?7.談?wù)凜OM的線程模型。然后討論進(jìn)程內(nèi)/外組件的差別。8.談?wù)処A32下的分頁機(jī)制小頁(4K)兩級(jí)分頁模式,大頁(4M)一級(jí)9.給兩個(gè)變量,如何找出一個(gè)帶環(huán)單鏈表中是什么地方出現(xiàn)環(huán)的?一個(gè)遞增一,一個(gè)遞增二,她們指向同一個(gè)接點(diǎn)時(shí)就是環(huán)出現(xiàn)的地方10.在IA32中一共有多少種辦法從用戶態(tài)跳到內(nèi)核態(tài)?經(jīng)過調(diào)用門,從ring3到ring0,中斷從ring3到ring0,進(jìn)入vm86等等11.如果只想讓程序有一個(gè)實(shí)例運(yùn)行,不能運(yùn)行兩個(gè)。像winamp一樣,只能開一個(gè)窗口,怎樣實(shí)現(xiàn)?用內(nèi)存映射或全局原子(互斥變量)、查找窗口句柄..FindWindow,互斥,寫標(biāo)志到文件或注冊(cè)表,共享內(nèi)存。.12.如何截取鍵盤的響應(yīng),讓所有的‘a(chǎn)’變成‘b’?鍵盤鉤子SetWindowsHookEx13.Apartment在COM中有什么用?為什么要引入?14.存儲(chǔ)過程是什么?有什么用?有什么優(yōu)點(diǎn)?我的理解就是一堆sql的集合,能夠建立非常復(fù)雜的查詢,編譯運(yùn)行,因此運(yùn)行一次后,以后再運(yùn)行速度比單獨(dú)執(zhí)行SQL快很多15.Template有什么特點(diǎn)?什么時(shí)候用?16.談?wù)刉indowsDNA結(jié)構(gòu)的特點(diǎn)和優(yōu)點(diǎn)。網(wǎng)絡(luò)編程中設(shè)計(jì)并發(fā)服務(wù)器,使用多進(jìn)程與多線程,請(qǐng)問有什么區(qū)別?1,進(jìn)程:子進(jìn)程是父進(jìn)程的復(fù)制品。子進(jìn)程獲得父進(jìn)程數(shù)據(jù)空間、堆和棧的復(fù)制品。2,線程:相對(duì)與進(jìn)程而言,線程是一個(gè)更加接近與執(zhí)行體的概念,它能夠與同進(jìn)程的其它線程共享數(shù)據(jù),但擁有自己的??臻g,擁有獨(dú)立的執(zhí)行序列。兩者都能夠提高程序的并發(fā)度,提高程序運(yùn)行效率和響應(yīng)時(shí)間。線程和進(jìn)程在使用上各有優(yōu)缺點(diǎn):線程執(zhí)行開銷小,但不利于資源管理和保護(hù);而進(jìn)程正相反。同時(shí),線程適合于在SMP機(jī)器上運(yùn)行,而進(jìn)程則能夠跨機(jī)器遷移。思科1.用宏定義寫出swap(x,y)#defineswap(x,y)\x=x+y;\y=x-y;\x=x-y;2.數(shù)組a[N],存放了1至N-1個(gè)數(shù),其中某個(gè)數(shù)重復(fù)一次。寫一個(gè)函數(shù),找出被重復(fù)的數(shù)字.時(shí)間復(fù)雜度必須為o(N)函數(shù)原型:注意a[N]中存放的是1-〉N-1個(gè)數(shù)intdo_dup(inta[],intN){inttemp[N]={0};for(inti=0;i<N;i++)if(temp[a[i]]!=0)returni;}3一語句實(shí)現(xiàn)x是否為2的若干次冪的判斷inti=512;cout<<boolalpha<<((i&(i-1))?false:true)<<endl;按位與運(yùn)算符a&b,對(duì)b中為1的位如果a中也為1則保留,a中其余位全部置0,剩下的a即為結(jié)果也能夠理解為保留a中與b中位1對(duì)應(yīng)的位,其余置0其余按位運(yùn)算符類似,將a與b按位做相應(yīng)運(yùn)算,所得值即結(jié)果4.unsignedintintvert(unsignedintx,intp,intn)實(shí)現(xiàn)對(duì)x的進(jìn)行轉(zhuǎn)換,p為起始轉(zhuǎn)化位,n為需要轉(zhuǎn)換的長(zhǎng)度,假設(shè)起始點(diǎn)在右邊.如x=0b00010001,p=4,n=3轉(zhuǎn)換后x=0b01100001unsignedintintvert(unsignedintx,intp,intn){unsignedint_t=0;unsignedint_a=1;for(inti=0;i<n;++i){_t|=_a;_a=_a<<1;}//_t包含n個(gè)1_t=_t<<p;//將n個(gè)1左移p位x^=_t;returnx;}慧通:什么是預(yù)編譯何時(shí)需要預(yù)編譯:1、總是使用不經(jīng)常改動(dòng)的大型代碼體。2、程序由多個(gè)模塊組成,所有模塊都使用一組標(biāo)準(zhǔn)的包含文件和相同的編譯選項(xiàng)。在這種情況下,能夠?qū)⑺邪募A(yù)編譯為一個(gè)預(yù)編譯頭。char*constp;charconst*pconstchar*p上述三個(gè)有什么區(qū)別?char*constp;//常量指針,p的值不能夠修改charconst*p;//指向常量的指針,指向的常量值不能夠改constchar*p;//和charconst*pcharstr1[]="abc";charstr2[]="abc";constcharstr3[]="abc";constcharstr4[]="abc";constchar*str5="abc";constchar*str6="abc";char*str7="abc";char*str8="abc";cout<<(str1==str2)<<endl;cout<<(str3==str4)<<endl;cout<<(str5==str6)<<endl;cout<<(str7==str8)<<endl;結(jié)果是:0011解答:str1,str2,str3,str4是數(shù)組變量,它們有各自的內(nèi)存空間;而str5,str6,str7,str8是指針,它們指向相同的常量區(qū)域。12.以下代碼中的兩個(gè)sizeof用法有問題嗎?[C易]voidUpperCase(charstr[])//將str中的小寫字母轉(zhuǎn)換成大寫字母{for(size_ti=0;i<sizeof(str)/sizeof(str[0]);++i)//sizeof(str)=4,為指針大小if('a'<=str[i]&&str[i]<='z')str[i]-=('a'-'A');}charstr[]="aBcDe";cout<<"str字符長(zhǎng)度為:"<<sizeof(str)/sizeof(str[0])<<endl;UpperCase(str);cout<<str<<endl;答:函數(shù)內(nèi)的sizeof有問題。根據(jù)語法,sizeof如用于數(shù)組,只能測(cè)出靜態(tài)數(shù)組的大小,無法檢測(cè)動(dòng)態(tài)分配的或外部數(shù)組大小。函數(shù)外的str是一個(gè)靜態(tài)定義的數(shù)組,因此其大小為數(shù)組大小6,函數(shù)內(nèi)的str實(shí)際只是一個(gè)指向字符串的指針,沒有任何額外的與數(shù)組相關(guān)的信息,因此sizeof作用于上只將其當(dāng)指針看,一個(gè)指針為4個(gè)字節(jié),因此返回4。一個(gè)32位的機(jī)器,該機(jī)器的指針是多少位指針是多少位只要看地址總線的位數(shù)就行了。80386以后的機(jī)子都是32的數(shù)據(jù)總線。因此指針的位數(shù)就是4個(gè)字節(jié)了。main(){inta[5]={1,2,3,4,5};int*ptr=(int*)(&a+1);printf("%d,%d",*(a+1),*(ptr-1));}輸出:2,5*(a+1)就是a[1],*(ptr-1)就是a[4],執(zhí)行結(jié)果是2,5&a+1不是首地址+1,系統(tǒng)會(huì)認(rèn)為加一個(gè)a數(shù)組的偏移,是偏移了一個(gè)數(shù)組的大?。ū纠?個(gè)int)int*ptr=(int*)(&a+1);則ptr實(shí)際是&(a[5]),也就是a+5原因如下:&a是數(shù)組指針,其類型為int(*)[5];而指針加1要根據(jù)指針類型加上一定的值,不同類型的指針+1之后增加的大小不同a是長(zhǎng)度為5的int數(shù)組指針,因此要加5*sizeof(int)因此ptr實(shí)際是a[5]可是prt與(&a+1)類型是不一樣的(這點(diǎn)很重要)因此prt-1只會(huì)減去sizeof(int*)a,&a的地址是一樣的,但意思不一樣,a是數(shù)組首地址,也就是a[0]的地址,&a是對(duì)象(數(shù)組)首地址,a+1是數(shù)組下一元素的地址,即a[1],&a+1是下一個(gè)對(duì)象的地址,即a[5].1.請(qǐng)問以下代碼有什么問題:intmain(){chara;char*str=&a;strcpy(str,"hello");printf(str);return0;}沒有為str分配內(nèi)存空間,將會(huì)發(fā)生異常問題出在將一個(gè)字符串復(fù)制進(jìn)一個(gè)字符變量指針?biāo)傅刂?。雖然能夠正確輸出結(jié)果,但因?yàn)樵浇邕M(jìn)行內(nèi)在讀寫而導(dǎo)致程序崩潰。char*s="AAA";printf("%s",s);s[0]='B';printf("%s",s);有什么錯(cuò)?"AAA"是字符串常量。s是指針,指向這個(gè)字符串常量,因此聲明s的時(shí)候就有問題。cosntchar*s="AAA";然后又因?yàn)槭浅A浚虼藢?duì)是s[0]的賦值操作是不合法的。1、寫一個(gè)“標(biāo)準(zhǔn)”宏,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)。#defi

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論