華清遠(yuǎn)見(jiàn)成都中心-C語(yǔ)言筆試題答案_第1頁(yè)
華清遠(yuǎn)見(jiàn)成都中心-C語(yǔ)言筆試題答案_第2頁(yè)
華清遠(yuǎn)見(jiàn)成都中心-C語(yǔ)言筆試題答案_第3頁(yè)
華清遠(yuǎn)見(jiàn)成都中心-C語(yǔ)言筆試題答案_第4頁(yè)
華清遠(yuǎn)見(jiàn)成都中心-C語(yǔ)言筆試題答案_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C語(yǔ)言筆試題答案

一、簡(jiǎn)答題

1.程序的局部變量存在于(棧)中,全局變量存在于(靜態(tài)區(qū))中,動(dòng)態(tài)申請(qǐng)數(shù)據(jù)存在于

(堆)中。

2.設(shè)有以下說(shuō)明和定義:

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

structdata{intcat;DATEcow;doubledog;}too;

DATEmax;

貝1」語(yǔ)句printfC^d';sizeoftstructdate)+sizeof(max));的執(zhí)行結(jié)果是:

data是一個(gè)union,變量公用空間.里面最大的變量類(lèi)型是屁⑸,占用20個(gè)字節(jié);所以

它的大小是20。

data是一個(gè)struct,每個(gè)變量分開(kāi)占用空間.依次為int4+DATE20+doubles=32.所以結(jié)

果是20+32=52.

3.32位系統(tǒng)下,請(qǐng)問(wèn)如下語(yǔ)句的值

unsignedchar*pl;

unsignedlong*p2;

pl=(unsignedchar*)0x801000;

p2=(unsignedlong*)0x810000;

請(qǐng)問(wèn)pl+5=0x801005

p2+5=0x810014

4.inti=10J=10,k=3;k*=i+j;k最后的值是?

答:60,此題考察優(yōu)先級(jí),實(shí)際寫(xiě)成:k*=(i+j);,賦值運(yùn)算符優(yōu)先級(jí)最低

5.#defineDOUBLE(x)x+x,i=5*DOUBLE(5);i是多少?

答案:i為30o

6.下面程序的輸出是,為什么?

char*ptr;

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

(

puts("Gotanullpointer");

)

else

(

puts("Gotavalidpointer");

)

答:Gotavalidpointe

當(dāng)malloc分配內(nèi)存時(shí)它除了分配我們指定SIZE的內(nèi)存塊,還會(huì)分配額外的內(nèi)存來(lái)存儲(chǔ)

我們的內(nèi)存塊信息,用于維護(hù)該內(nèi)存塊。因此,malloc(0)返回一個(gè)合法的指針并指

向存儲(chǔ)內(nèi)存塊信息的額外內(nèi)存,我們當(dāng)然可以在該內(nèi)存上進(jìn)行讀寫(xiě)操作,但是這樣做了

會(huì)破壞該內(nèi)存塊的維護(hù)信息,因此當(dāng)我們調(diào)用free(ptr)時(shí)就會(huì)出現(xiàn)錯(cuò)誤

在MSDN可以找到答案

原話(huà)是

"Ifsizeis0,mallocallocatesazero-lengthitemintheheapandreturnsavalidpointe

rtothatitem"

如果申請(qǐng)內(nèi)存大小為0,還是會(huì)返回一個(gè)有效指針

返回指針為NULL的條件是申請(qǐng)一定大小內(nèi)存,內(nèi)存空間不夠的時(shí)候

7.以下程序運(yùn)行后的輸出結(jié)果是。

main()

(

charm;

m='B'+32;printf("%c\rT,m);

)

答:b

8.已有定義如下:

structnode

(

intdata;

structnode*next;

)*P;

以下語(yǔ)句調(diào)用malloc函數(shù),使指針p指向一個(gè)具有structnode類(lèi)型的動(dòng)態(tài)存儲(chǔ)空間。

請(qǐng)?zhí)羁誴=(structnode*)malloc();

答:sizeof(structnode)

9.在絕對(duì)地址OxXXXXXXXX上寫(xiě)入字符H的語(yǔ)句是。

答:unsignedchar*p=(unsignedchar*)OxFOOOFFOO;

*P=

10.用預(yù)處理指令#define聲明一個(gè)常數(shù),用以表明1年中有多少秒(忽略閏年問(wèn)題),

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

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

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

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

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

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

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

記住,第一印象很重要。

11.寫(xiě)一個(gè)“標(biāo)準(zhǔn)”宏MIN,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)。

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

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

為標(biāo)準(zhǔn)C的一部分之前,宏是方便產(chǎn)生嵌入代碼的唯一方法,對(duì)于嵌入式系統(tǒng)來(lái)說(shuō),為

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

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

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

3)懂得在宏中小心地把參數(shù)用括號(hào)括起來(lái),因?yàn)?define僅僅做替換,如果我們寫(xiě)

#defineMUL(a,b)a/b的話(huà),那么我寫(xiě)MUL(a+l,b?l)替換之后的表達(dá)式就為a+1/替工,

這個(gè)結(jié)果顯然是違背我們定義的目的的。

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

這個(gè)問(wèn)題用幾個(gè)解決方案。

while(l){}或者for(;;){}

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

a)—*個(gè)整型數(shù)(Aninteger)

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

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

anintege)

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

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

integers)

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

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

functionthattakesanintegerasanargumentandreturnsaninteger)

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

個(gè)整型數(shù)(Anarrayoftenpointerstofunctionsthattakeanintegerargumentand

returnaninteger)

答案是:

a)inta;//Aninteger

b)int*a;//Apointertoaninteger

c)int**a;//Apointertoapointertoaninteger

d)inta[10];//Anarrayof10integers

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

f)int(*a)[10j;//Apointertoanarrayof10integerssizeof(a)=4;sizeof(*a)=40;

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

integer

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

returnaninteger

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

全局變量(外部變量)的說(shuō)明之前再冠以static就構(gòu)成了靜態(tài)的全局變量。全局變量本身

就是靜態(tài)存儲(chǔ)方式,靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲(chǔ)方式。這兩者在存儲(chǔ)方式上并無(wú)

不同。這兩者的區(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ǔ)方式即改變了它的生存期。把全局變量改變?yōu)殪o

inta,b;

a=*ptr;

b=*ptr;

returna*b;

)

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

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

longsquare(volatileint*ptr)

(

inta;

a=*ptr;

returna*a;

)

20.在某工程中,要求設(shè)置一絕對(duì)地址為0x67a9的整型變量的值為0xaa660編譯器是一個(gè)

純粹的ANSI編譯器.寫(xiě)代碼去完成這一任務(wù)。

答:

int*ptr;

ptr=(int*)0x67a9;

*ptr=0xaa55;

21.局部變量能否和全局變量重名?

答:能,局部會(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)。

22.如何引用一個(gè)已經(jīng)定義過(guò)的全局變量?

答:extern

可以用引用頭文件的方式,也可以用extern關(guān)鍵字,如果用引用頭文件方式來(lái)引用某

個(gè)在頭文件中聲明的全局變理,假定你將那個(gè)變寫(xiě)錯(cuò)了,那么在編譯期間會(huì)報(bào)錯(cuò),如果

你用extern方式引用時(shí),,假定你犯了同樣的錯(cuò)誤,那么在編譯期間不會(huì)報(bào)錯(cuò),而在連

接期間報(bào)錯(cuò)。

23.全局變量可不可以定義在可被多個(gè).C文件包含的頭文件中?為什么?

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

中聲明同名的全局變量,前提是其中只能有一個(gè)C叉件中對(duì)此變量賦初值,此時(shí)連接不

會(huì)出錯(cuò).

24.語(yǔ)句for(:1:)有仆么問(wèn)題?它是什么意思?

答:和while(l)相同,死循環(huán)。

25.d。.while和while......do17什么區(qū)別?

答:前一個(gè)循環(huán)一遍再判斷,后一個(gè)判斷以后再循環(huán)。

26.下列哪種方法更好,為什么?

definedPSstructs*

typedefstructs*tPS;

以上兩種情況的意圖都是要定義dPS和tPS作為一個(gè)指向結(jié)構(gòu)s指針。哪種方法更好

呢?(如果有的話(huà))為什么?

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

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

dPSpl,p2;

tPSp3,p4;

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

structs*plzp2;

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

第二個(gè)例子正確地定義了p3和p4兩個(gè)指針。

27.下面的結(jié)構(gòu)是合法的嗎,如果是它做些什么?

inta=5,b=7,c;

c=a+++b;

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

成:

c=a+++b;

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

28.隊(duì)列和棧有什么區(qū)別?

隊(duì)列先進(jìn)先出,棧后進(jìn)先出

29.全局變量和局部變量是否有區(qū)別?如果有,是什么區(qū)別?

全局變最儲(chǔ)存在靜態(tài)數(shù)據(jù)庫(kù),局部變最在堆棧。

全局變量的作用域在定義之下的任何位置

而局部變量的作用域在函數(shù)模塊內(nèi)

全局變量的生命周期從編譯開(kāi)始到程序結(jié)束

而局部變量的聲明周期從定義開(kāi)始到函數(shù)結(jié)束

30.堆棧溢出一般是由什么原因?qū)е碌模?/p>

沒(méi)有回收垃圾資源。

31.冒泡排序算法的時(shí)間賽雜度是什么?+

時(shí)間復(fù)雜度是O(N2)。

32.分別寫(xiě)出BOOL,int,float,指針類(lèi)型的變量a與“零〃的比較語(yǔ)句。

答案:

BOOL:if(!a)orif(a)

int:if(a==0)

float:constEXPRESSIONEXP=0.000001

if(a<EXP&&a>-EXP)

pointer:if(a!=NULL)orif(a==NULL)

33.不能做switch。的參數(shù)類(lèi)型是:

switch的參數(shù)不能為實(shí)型。

34.某32位系統(tǒng)下,請(qǐng)L算sizeof的值.

charstr[]="http:〃/"

char*p=str;

intn=10;

請(qǐng)計(jì)算

sizeof(str)=?(1)

sizeof(p)=?(2)

sizeof(n)=?(3)

voidFoo(charstr[100]){

sizeof(str)=?(4)

)

void*p=mallocf100);

sizeof(p)=?(5)

答:(1)字符串末尾有‘\0'字符,所以是17

(2)4

(3)4

(4)str是指針而并非數(shù)組,所以是4,在形參中不能定義數(shù)組,所有以數(shù)組形式出

現(xiàn)的都是指針

(5)p的類(lèi)型是指針?biāo)允?

35.請(qǐng)說(shuō)出const與#defire相比,有何優(yōu)點(diǎn)?

答:

1)const常量有數(shù)據(jù)類(lèi)型,而宏常量沒(méi)有數(shù)據(jù)類(lèi)型。編譯器可以對(duì)前者進(jìn)行類(lèi)型安全

檢查。而對(duì)后者只進(jìn)行字符替換,沒(méi)有類(lèi)型安全檢查,并且在字符替換可能會(huì)產(chǎn)生意料

不到的錯(cuò)誤。

2)有些集成化的調(diào)試工具可以對(duì)const常量進(jìn)行調(diào)試,但是不能對(duì)宏常量進(jìn)行調(diào)試。

36.回答下面的問(wèn)題.

a)頭文件中的ifndef/define/endif干什么用?預(yù)處理

答:防止頭文件被重復(fù)引用

b)#include<filename.h>fO#include"filename.h”有什么區(qū)別?

答:前者用來(lái)包含開(kāi)發(fā)環(huán)境提供的庫(kù)頭文件,后者用來(lái)包含自己編寫(xiě)的頭文件。

37.使用malloc()函數(shù)時(shí),為什么要將其返回值強(qiáng)制轉(zhuǎn)換成被賦值指針變量的數(shù)據(jù)類(lèi)型?

答:因?yàn)閙alloc返回值為void*型指針,對(duì)于void*型指針必須先強(qiáng)制類(lèi)型轉(zhuǎn)換才能夠

使用。

38.列舉?個(gè)軟件中時(shí)間換空間或者空間換時(shí)間的例子。

答:

voidswap(intajntb)

(

intc;c=a;a=b;b=a;

)

空間換時(shí)間

voidswapfinta,intb)

(

a=a+b;b=a-b;a=a-b;

)

39.以下C語(yǔ)言語(yǔ)句有什么區(qū)別

char*constp;

charconst*p;

constchar*p;

答:

char*constp;〃常量指針,p的值不可以修改

charconst*p;〃指向常量的指針,指向的常量值不可以改

constchar*p:〃和charconst*p

40.下面x,y,*p的值是多少,有什么問(wèn)題?

intx,y,z=2;

int*p=&z;

x=sizeof*p;

V=x/*p;

答:如果你按這個(gè)寫(xiě)出來(lái),肯定編譯不過(guò)去。最明顯的:y=x/*p;應(yīng)該改為y=x/(*p)

還有sizeof*p改為sizeof(*p);

y=2,x=4,z=2,*p=2;

41.下面的語(yǔ)句是什么意思?如何聲明或定義才使它們更易懂?(10分)

int(*foo())();*foo()為一指針函數(shù),inta()函數(shù)

int(*foo())[];*foo()為一指針函數(shù),inta。數(shù)組

int(*foo[])();*foo口為一指針數(shù)組,inta()函數(shù)

(*(void(*)())0)();void(*)()為一函數(shù)指針,⑶0,數(shù)據(jù)類(lèi)型轉(zhuǎn)換,(*a川函數(shù)指針

void(*signal(int,void(*)(int)))(int);

void(與(int)函數(shù)指針,*signal(int,a)指針函數(shù),voidb(int)函數(shù)

答:

第一個(gè):int(*foo())();

先一步一步的分析:首先是被左邊的()括起來(lái)的*匕。()。

(1)里面()的優(yōu)先級(jí)高于*,所以foo()先是一個(gè)函數(shù);

⑵*foo()說(shuō)明這個(gè)函數(shù)返回一個(gè)指針;

(3)(*foo())()這個(gè)函數(shù)返回的指針指向一個(gè)函數(shù);

(4)int(*foo())();

(5)最后這個(gè)函數(shù)返回一個(gè)整型數(shù)。

第二個(gè):int(*foo(皿;

有上面的打基礎(chǔ)了,這回好多了。大致還是那個(gè)意思,但是就是由函數(shù)變成了數(shù)組,

所以還更簡(jiǎn)單些,具體的含義是:f。")函數(shù)返回的指針指向一個(gè)具有整型數(shù)的數(shù)組。

第三個(gè):int(*foo[])();

這個(gè)就是上兩個(gè)的翻版:一個(gè)存有指針的數(shù)組葉。。口,該指針指向一個(gè)函數(shù),該函

數(shù)返回一個(gè)整型數(shù)。

第四個(gè):(*(void(*)())0)();

(1)最里面的(*)()意思是一個(gè)指向函數(shù)的指針;

(2)加個(gè)前綴void(>(),表示一個(gè)指向返I口I類(lèi)型為void的函數(shù)的指針;

(3)套個(gè)馬甲(void(*M))的意思就是類(lèi)型強(qiáng)制轉(zhuǎn)換:

(4)(void(*)())0就是把0強(qiáng)制轉(zhuǎn)換成前面說(shuō)的那個(gè)類(lèi)型的指針;

(5)那么好,現(xiàn)在(void(*)())0是一個(gè)指計(jì)了,這個(gè)指針指向了一個(gè)函數(shù),我任用宏

定義簡(jiǎn)化一下,看著太麻煩:

(6)#defineptr(void(*)())0,現(xiàn)在(*(void(*)())0)();這個(gè)怪物就可以簡(jiǎn)化成:(*ptr");

(7)別忘了ptr是一個(gè)指向函數(shù)的指針,既然這樣*ptr就是函數(shù)了,那么上面的結(jié)

果再次被簡(jiǎn)化成:ptr();,這不就是函數(shù)的調(diào)用么!

至此這個(gè)怪物函數(shù)的含義和簡(jiǎn)化形式就都給出了,我就不再總結(jié)了。不過(guò)我還想再

給出一個(gè)簡(jiǎn)化形式,這會(huì)對(duì)下面的問(wèn)題有啟示:

使用typedef,typedefvoid(*ptij();,然后就可以用(*(ptr)O)();來(lái)表示這個(gè)怪物函數(shù)

了,其靈活性比使用#€12例€要高。

第五個(gè):

void(*signal(intzvoid(*)(int)))(int);

這是著名的signal函數(shù)的原型,可以如此聲明:

typedefvoid(*H^NDLER)(int);

HANDLERsignal(int,HANDLER);

或者:

typedefvoidHANDLER(int);

HANDLER*signal(int,HANDLER*);

42.如何定義Bool變量的TRUE和FALSE的值。

答:#defineTURE1

#defineFALSE0

43.運(yùn)行chara[]=〃abc〃后,內(nèi)存會(huì)開(kāi)辟幾塊內(nèi)存,這此內(nèi)存共占多少個(gè)字節(jié)?

答:這句話(huà)為定義數(shù)組,省略下表后根據(jù)元素個(gè)數(shù)決定,因?yàn)椤癮bc”為字符串,加上

末尾’\0'共有4個(gè)元素所以是四個(gè)字節(jié)。

44.運(yùn)行char*p=〃abc"后,內(nèi)存會(huì)開(kāi)辟幾塊內(nèi)存,這此內(nèi)存共占多少個(gè)字節(jié)?

答:這句話(huà)為定義指計(jì)指向字符串常量區(qū)字符串“abc”,任何指針都為4個(gè)字節(jié),所以

共占4個(gè)字節(jié)。

45.說(shuō)出⑶;p是什么變量?如果p是指針變量,那么p+1的偏移量是多少?

答:P為指針變量,P指向類(lèi)型為裝了三個(gè)元素的指針數(shù)組,因?yàn)樗兄羔樤?2位系

統(tǒng)下都是四個(gè)字節(jié),所以偏移量為12個(gè)字節(jié)。

46.一個(gè)32位的機(jī)器,該機(jī)器的指針是多少位?

答:32位

47.已知一個(gè)數(shù)組table,用一個(gè)宏定義,求出數(shù)據(jù)的元素個(gè)數(shù)

答:ttdefinelength(table)(sizeof(table)/sizeof(table[0]?

二、程序分析題

1.下面的代碼有什么問(wèn)題?

char*_strdup(constchar*strSource)

staticcharstr[MAX_STR_LEN];

strcpy(stcstrSource);

returnstr;

)

答:返I可局部變量地址。

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

voidfoo(void)

(

unsignedinta=6;

intb=-20;

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

)

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

少這些東西。不管如何,這無(wú)符號(hào)整型問(wèn)題的答案是輸出是”>6,原因是當(dāng)表達(dá)式中

存在有符號(hào)類(lèi)型和無(wú)符號(hào)類(lèi)型時(shí)所有的操作數(shù)都自動(dòng)轉(zhuǎn)換為無(wú)符號(hào)類(lèi)型。因此-20變成

了一個(gè)非常大的正整數(shù),所以該表達(dá)式計(jì)算出的結(jié)果大于6。

3.請(qǐng)寫(xiě)出下列代碼的輸出內(nèi)容

#include

main{)

(

?nta,b,c,d;

a=10;

b=a++;

c=++a;

d=10*a++;

printff'b,c,d:%d,%d,%d",b,c,d);

return0;

)

答:10,12,120

4.lest函數(shù)的運(yùn)行結(jié)果如何?

voidGetMemory(char*p)

(

p=(char*)malloc(100);

)

voidTest(void)

(

char*str=NULL;

GetMemory(str);

strcpyfstr,"helloworld");

printf(str);

)

答:段錯(cuò)誤,GetMemory(str)傳的是str地址并沒(méi)有改變str的值,所以p并不能夠

改變str的指向,str依然是NULL,strcpy向NULL賦值造成段錯(cuò)誤。

5.Test函數(shù)的運(yùn)行結(jié)果如何?

char*GetMemory(void)

charp[]="hellov/orld";

returnp;

)

voidTest(void)

(

char*str=NULL;

str=GetMemoryl);

printf(str);

)

答:返回局部變量地址。

6.Test函數(shù)的運(yùn)行結(jié)果如何?

VoidGetMemory2(char**p,intnum)

(

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

)

voidTest(void)

(

char*str=NULL;

GetMemoryf&str,100);

strcpy(str,"hello");

printf(str);

)

答:內(nèi)存溢出,malloc申請(qǐng)的空間使用結(jié)束之后沒(méi)有釋放

7.Test函數(shù)的運(yùn)行結(jié)果如何?

voidTest(void)

(

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

strcpy(str,"hello");

free(str);

if(str!=NULL)

(

strcpy(str,"world");

printf(str);

)

)

答:一內(nèi)存溢出,二free釋放malloc申請(qǐng)的內(nèi)存空間之后繼續(xù)操作該空間,但是該程

序能夠打印出world但是操作是非法的。

8.寫(xiě)出下列代碼的輸出內(nèi)容

#indude

intinc(inta)

(

return(++a);

)

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

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

)

typedefint(FUNCl)(intin);

typedefint(FUNC2)(int*Jnt*zint*);

voidshow(FUNC2fcnjntargl,int*arg2)show(multi,10.&a)

(

INCp=&inc;

inttemp=p(argl);

funt&temp^argl,arg2);

printf("%dn"/arg2);

)

main()

(

inta;

show(multi,10,&c);

return0;

)

答:110

9.請(qǐng)找出下面代碼中的所以錯(cuò)誤

說(shuō)明:以下代碼是把一個(gè)字符串倒序,如"abed”倒序后變?yōu)?dcba〃

#include"string.h"

main()

(

char*src="hello/world";

char*dest=NULL;

intlen=strlen(src);

dest=(char*)malloc(len);

char*d=dest;

char*s=src[len];

while(len-!=0)

d++=s-;

printf(“%s”,dest);

return0;

)

答:

方法1:

intmain()

|

char*sre="heIo,world";

intlen=strlen(src);

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

char*d=dest;

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

while(len-!=0)

*d++=*s—;

*d=0;〃尾部要加0

printf(”%sn”,dest);

free(dest);//便用完,應(yīng)當(dāng)釋放空間,以免造成內(nèi)存匯泄露

return0;

)

方法2:

Intmain()

(

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;

)

10.以下程序有什么錯(cuò)誤

試題1:

voidtestlf)

(

charstring[10];

char*strl="0123456789";

strcpy(string,strl);

)

答:數(shù)組越界string數(shù)組只有十個(gè)元素空間,字符串strl有11個(gè)字節(jié)

試題2:

voidtest2()

(

charstring[10]zstrl[10];

inti;

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

(

strl='a";

)

strcpyfstring,strl);

)

答:有可能造成數(shù)組越界,stC里所有元素都是字符‘a(chǎn)',strcpy及制遇到‘\0'才會(huì)

停止,而strl數(shù)組里沒(méi)有字符串結(jié)束標(biāo)志'\01所以有可能造成數(shù)組越界。

試題3:

voidtest3(char*strl)

(

charstring[10];

if(strlen(strl)<=10)

(

strcpy(string,strl);

}

)

答:if(strlen(strl)<=10)應(yīng)改為if(strlen(strl)<10),因?yàn)閟trlen的結(jié)果未統(tǒng)計(jì)所占用

的1個(gè)字節(jié)。

11.下面程序的運(yùn)行結(jié)果:

main()

(

inta[5]={lz2,3A5};

int*ptr=(int*)(&a+l);

printf("%d/%d"/*(a+l)/*(ptr-l));

)

答:2,5

12.請(qǐng)問(wèn)以下代碼有什么問(wèn)題:

intmain()

(

chara;char*str=&a;

strcpy(str,"hello");

printf(str);

return0;

)

答:沒(méi)有為str分配內(nèi)存空間,將會(huì)發(fā)生異常問(wèn)題出在將一個(gè)字符串復(fù)制進(jìn)一個(gè)字符變

最指針?biāo)傅刂贰km然可以正確輸出結(jié)果,但因?yàn)樵浇邕M(jìn)行內(nèi)在讀寫(xiě)而導(dǎo)致程序崩潰。

13.交換兩個(gè)變量的值,不使用第三個(gè)變量。即a=3,b=5,交換之后a=5,b=3;

答:

a=aAb;

b=aAb;

a=aAb;

14.以下是求一個(gè)數(shù)的平方的程序,請(qǐng)找出錯(cuò)誤:

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

inta=5;

intb;

b=SQUARE(a++);

答:要寫(xiě)成inta=5;a++;b=SQUARE(a),不然直接傳a++的值還是5。

15.下面的程序運(yùn)行結(jié)果是()

設(shè)

intarr[]={6/7,8,9,10);

int*ptr=arr;

(ptr++)+=123;//

print—"%d,%dM,*ptr,*(++ptr));

答:8,8

16.下面的兩段代嗎?有什么區(qū)別?什么時(shí)候需要使用代碼2?

1、

inti=10;

intj=i;

intk=i;

2、

volatileinti=10;

intj=i;

intk=i;

答:代碼1,這時(shí)候編譯器對(duì)代碼進(jìn)行優(yōu)化,因?yàn)樵诖a1中的兩條語(yǔ)句之間i沒(méi)有被

用作左值(即沒(méi)有被賦值),這時(shí)候編譯器認(rèn)為i的值沒(méi)有發(fā)生改變,所以在第1條語(yǔ)

句時(shí)從內(nèi)存取出i的值賦給j之后,這個(gè)值并沒(méi)有被丟掉,而在第2條語(yǔ)句時(shí),繼續(xù)用

這個(gè)值給k賦值。編譯器不會(huì)生成匯編代碼重新從內(nèi)存讀取i的值。

代碼2,volatile關(guān)鍵字告訴編譯器,i是隨時(shí)可能發(fā)生的變化的,每次使用它的時(shí)候,

必須從內(nèi)存中取出i的值。因而編譯器生成的匯編代碼會(huì)重新從i的地址處讀取數(shù)據(jù)放

在k中。

代碼2,的使用時(shí)機(jī),如果i是一個(gè)寄存器變量,表示一個(gè)商品數(shù)據(jù)或者是多個(gè)線(xiàn)程的

共享數(shù)據(jù),那么就容易出錯(cuò),所以說(shuō)volatile可以保證對(duì)特殊地址的穩(wěn)定訪(fǎng)問(wèn)。

17.printf("%d",OxOl?2+3);輸出?

答:7。〃應(yīng)該為32,因?yàn)樵诓僮鞣膬?yōu)先級(jí)中,算術(shù)操作符的優(yōu)先級(jí)高于移位運(yùn)算操

作符的優(yōu)先級(jí)

18.在32位的X86系統(tǒng)下,輸出的值為多少?

include<stdio.h>

intmain()

(

inta[5]={1,2,3,4,5};

int*ptrl=(int*)(&a+1);

int*ptr2=(int*)((int)a+1);

printf("%d,%x",p:rl[-l],*ptr2);

〃注意從高字節(jié)開(kāi)始打印

return0;

)

答:5,2

19.下面代碼的有問(wèn)題嗎?為什么?

include<stdio.h>

voidfunc(chara(10])/相當(dāng)于voidfunc(char*a)

(

charc=a[3];

}

intmain()

(

charb[10]="abcdefg";

func(b[10]);

return0;

)

答:這里至少有兩上嚴(yán)重錯(cuò)誤,

第一,b[10]并不存在,在編譯的時(shí)候,由于沒(méi)有去實(shí)際地址取值,所以沒(méi)有出錯(cuò)。但

在運(yùn)行的時(shí),

將計(jì)算b[10]的實(shí)際地址,并且取值。這時(shí)候發(fā)生越界錯(cuò)誤。

第二,func函數(shù)會(huì)將傳入的char類(lèi)型的數(shù)據(jù)當(dāng)作地址處理,同樣會(huì)發(fā)生錯(cuò)誤。

20.下面代碼輸出的結(jié)果是多少?

#include<stdio.h>

voidfun(inti)

(

if(i>0)

(

fun(i/2);

)

printf("%d\n"J);

)

intmain()

(

fun(10);

return0;

)

答:0,1,2,5,10析:遞歸展開(kāi)

三、編程題

1.不調(diào)用庫(kù)函數(shù),自己實(shí)現(xiàn)memcpy困數(shù)。

typedefintsize_tt;

〃源串要有修飾

void*memcpy(void*dest,constvoid*srczsize_ttcount)const

(

char*pDest=(char*)(dest);〃將原始指針賦給新變量

constchar*pSrc=(constchar*)(src);

〃判斷傳參是否合法

if(NULL==dest11NULL==src)

(

returnNULL;

)

〃目的地址和源地址重疊,從源地址的末尾方向開(kāi)始拷貝

if(pDest>pSrc&&pDest<pSrc+count)

〃將指針指向末尾

pDest=pDest+count-1;

pSrc=pSrc+count-1;

while(count-)

*pDest--=*pSrc--;

)

)

〃目的地址和源地址不重疊,從源地址的開(kāi)始方向拷貝

else

(

while(count-)

(

*pDest++=*pSrc++;

)

)

returnpDest;〃返I可,這樣可以嵌套使用

}

2.不調(diào)用庫(kù)函數(shù),自己實(shí)現(xiàn)strcpy函數(shù)。

intStrcmp(constchar*strl,constchar*str2)

(

assert(strl&&srt2);

while(*strl&&*str2&&(*strl==*str2))

(

strl-i-+;

str2++;

}

return(*strl-*str2);

)

3.

a)編寫(xiě)strcat函數(shù),已知strcat函數(shù)的原型是char*strcat(char*strDest,constchar

*strSrc);其中strDest是目的字符串,strSrc是源字符串(不能調(diào)用庫(kù)函數(shù))。

include<stdio.h>

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

{

if(NULL==dst11NULL==src)

{

returnNULL;

)

char*cp=dst;

whilef*cp)

cp++;/*findendofdst*/

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

returndst;/*returndst*/

)

intmain()

(

charstrl[100]="helloworld";

charstr2[]="Jt'sbeautiful!";

printf("%s\n”,strcat(strl,st⑵);

return0;

)

b)strcat能把strSrc的內(nèi)容連接到strDest,為什么還要char*類(lèi)型的返回值?

答:方便賦值給其他變量

4.兩個(gè)字符串,s,t;把t字符串插入到s字符串中,s字符串有足夠的空間存放t字符串。

char*insert(char*t,constchar*s)

(

char*q=t;

constchar*p=s;

if(NULL==q]

returnNULL;

while(*p!='\0')

{

P++;

)

while(+q!=0)

(

*p=*q;

P++;

q++;

)

*P='\0';

returnt;

)

5.寫(xiě)一函數(shù),實(shí)現(xiàn)刪除字符串strl中含有的字符串str2。

ftinclude<stdio.h>

char*delstr(char*src,constchar*sub)

(

char*st=src,*sl=NULL;

constchar*s2=NULL;

while(*st&&*sub)

si=st;

s2=sub;

while(*sl&&*s2&&!(*sl-*s2))

(

sl-+;

s2-+;

)

if(I*s2)

(

while(*st++=*sl++);

st=src;

)

st++;

)

return(src);

)

intmain()

(

charstrl[]="nihaowodepengyou";

charstr2[]="hao";

printf("%s\n",delstr(strl,st⑵);

return0;

}

6.編程,判斷存儲(chǔ)方式是大端存儲(chǔ),還是小端存儲(chǔ),并說(shuō)出為什么要進(jìn)行大小端的判定?

intcheck_little_endian()

(

union{

inta;

charb;

)c;

c.a=l;

return(c.b==1);

)

intcheck_little_endian()

(

inti=0x00000001;

char*p=&a;

return*P;

)

staticunion

(

charc[4];

unsignedlongI;

}endian_test={{'l';?7?7b,}};

"defineENDIANNESS((char)endian_test.l)

7.不調(diào)用庫(kù)函數(shù),自己實(shí)現(xiàn)longatol(constchar*nptr)函數(shù)。

long_cdeclatol(constchar*nptr)/*1.const修飾*/

(

intc;/*currentchar*/

longtotal;/*currenttotal*/

intsign;/*ifthennegative,otherwisepositive*/

/*skipwhitespace*/

/?char,signedcharunsignedchar類(lèi)型的數(shù)據(jù)具有相同的特性然而當(dāng)你把一

個(gè)單字節(jié)的數(shù)賦給一個(gè)整型數(shù)時(shí),便會(huì)看到它們?cè)诜?hào)擴(kuò)展上的差異。*/

/*ascii碼當(dāng)賦給整形數(shù)時(shí)要轉(zhuǎn)為unsignedchar再轉(zhuǎn)為int*/

while(isspace((int)(unsignedchar)*nptr))/*2.去掉首部的空格*/

++nptr;

c=(int)(unsignedchar)*nptr++;/*取得第一個(gè)非空格的字符*/

sign=c;/*savesignindication*/

if(c==c=='+')〃如果笫一個(gè)非空格字符為符號(hào)”/

c=(int)(unsignedchar)*nptr++;/*skipsign*/

/*跳過(guò)符號(hào),將符號(hào)后的那個(gè)字符給c*/

total=0;/*結(jié)果置為0*/

while(isdigit(c)){/*3.如果碰到非法字符則停止*/

total=10*total+(c-'0');/*accumulatedigit*/

c=(int)(unsignedchar)*nptr++;/*getnextchar*/

)

if(sign==

return-total;

else

returntotal;/*returnresult,negatedifnecessary*/

}

8.編寫(xiě)strcat函數(shù)0。已知strcat函數(shù)的原型是char*str:at(char*strDest,constchar*strSrc);

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

a)不調(diào)用C++/C的字符串庫(kù)函數(shù),請(qǐng)編寫(xiě)函數(shù)strcato

char*_cdeelstrcat(char*dst,constchar*sre)

{

insert(dest!=NULL&&sre!=NULL);

char*cp=dst;

whilef*cp)

cp++;/*findendofdst*/

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

return(dst);/*returndst*/

)

b)strcat能把strSrc的內(nèi)容連接到strDest,為什么還要char*類(lèi)型的返回值?

答:方便賦值給其他變量

9.寫(xiě)一個(gè)函數(shù),它的原形是intcontinumax(char*outputstr,char*intputstrj。功能:在字符串

中找出連續(xù)最長(zhǎng)的數(shù)字串,并把這個(gè)串的長(zhǎng)度返回,并把這個(gè)最長(zhǎng)數(shù)字串付給其中一個(gè)

函數(shù)參數(shù)outputstr所指內(nèi)存。例如:"abcdl2345edl25ssi23456789”的首地址傳給

intputstr后,函數(shù)將返回9,outputstr所指的值為123456789

intcontinumax(char*outputstr,char*inputstr)

(

char*in=inputstr,*out=outputs"*temp,“final;

intcount=0,maxlen=0;

while(*in!='\0')

(

if(*in>47&&*in<58)

(

for(temp=in;*in>47&&*in<58;in++)

count++;

)

else

in++;

if(maxlen<count)

(

maxlen=count;

count=0;

final=temp;

)

)

for(inti=0;i<maxlen;i++)

*out=*final;

out++;

final++;

)

*out='\0';

returnmaxlen;

)

10,不用庫(kù)函數(shù),用C語(yǔ)言實(shí)現(xiàn)將一整型數(shù)字轉(zhuǎn)化為字符串。

intgetlen(char*s)

(

intn;

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

n++;

returnn;

)

voidreverse(chars[])

(

intc,i,j;

for(i=0J=g2tlen(s)-1;i<j;i++J-)

(

c=s[i];

s[i]=s[j];

sUl=c;

)

)

voiditoa(intn,chars[])

(

inti,sign;

if((sign=n)<0)

n=-n;

i=0;

do{/*以反序生成數(shù)字*/

s(i++]=n%10+'O';/*getnextnumber*/

}while((n/=10)>0);/*deletethenumber*/

if(sign<0)

s[i++]=

s[i]='\0';

reverse(s);

)

#inclu

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論