c語(yǔ)言經(jīng)典筆試題(非常全)54頁(yè)_第1頁(yè)
c語(yǔ)言經(jīng)典筆試題(非常全)54頁(yè)_第2頁(yè)
c語(yǔ)言經(jīng)典筆試題(非常全)54頁(yè)_第3頁(yè)
c語(yǔ)言經(jīng)典筆試題(非常全)54頁(yè)_第4頁(yè)
c語(yǔ)言經(jīng)典筆試題(非常全)54頁(yè)_第5頁(yè)
已閱讀5頁(yè),還剩49頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1. 用預(yù)處理指令#define 聲明一個(gè)常數(shù),用以表明1年中有多少秒(忽略閏年問(wèn)題)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 2. 寫一個(gè)“標(biāo)準(zhǔn)”宏MIN,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)。#define MIN(A,B) (A) = (B) (A) : (B) 4. 嵌入式系統(tǒng)中經(jīng)常要用到無(wú)限循環(huán),你怎么樣用C編寫死循環(huán)呢?這個(gè)問(wèn)題用幾個(gè)解決方案。我首選的方案是: while(1) 一些程序員更喜歡如下方案: for(;) 第三個(gè)方案是用 goto Loop: . goto Loop;5. 用變量a給出下面的定義 a) 一個(gè)整型數(shù)(A

2、n integer) b) 一個(gè)指向整型數(shù)的指針(A pointer to an integer) c) 一個(gè)指向指針的的指針,它指向的指針是指向一個(gè)整型數(shù)(A pointer to a pointer to an integer) 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è)

3、整型參數(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

4、) int *a; / A pointer to a pointer to an integer d) int a10; / An array of 10 integers e) int *a10; / 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 and returns an integer h) int (

5、*a10)(int); / An array of 10 pointers to functions that take an integer argument and return an integer 6. 關(guān)鍵字static的作用是什么?這個(gè)簡(jiǎn)單的問(wèn)題很少有人能回答完全。在C語(yǔ)言中,關(guān)鍵字static有三個(gè)明顯的作用: 1). 在函數(shù)體,一個(gè)被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過(guò)程中維持其值不變。 2). 在模塊內(nèi)(但在函數(shù)體外),一個(gè)被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問(wèn),但不能被模塊外其它函數(shù)訪問(wèn)。它是一個(gè)本地的全局變量。 3). 在模塊內(nèi),一個(gè)被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的

6、其它函數(shù)調(diào)用。那就是,這個(gè)函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。 7關(guān)鍵字const是什么含意? 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ù)的常指針(也就是說(shuō),指針指向的整型數(shù)是可以修改的,但指針是不可修改的)。最后一個(gè)意味著a是一個(gè)指向常整型數(shù)的常指針(也就是說(shuō),指針指向的整型數(shù)是不可修改的,同時(shí)指針也是不可修改的)。如果應(yīng)試者能正確回

7、答這些問(wèn)題,那么他就給我留下了一個(gè)好印象。8. 關(guān)鍵字volatile有什么含意 并給出三個(gè)不同的例子。一個(gè)定義為volatile的變量是說(shuō)這變量可能會(huì)被意想不到地改變,這樣,編譯器就不會(huì)去假設(shè)這個(gè)變量的值了。精確地說(shuō)就是,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的值,而不是使用保存在寄存器里的備份。下面是volatile變量的幾個(gè)例子: 1). 并行設(shè)備的硬件寄存器(如:狀態(tài)寄存器) 2). 一個(gè)中斷服務(wù)子程序中會(huì)訪問(wèn)到的非自動(dòng)變量(Non-automatic variables) 3). 多線程應(yīng)用中被幾個(gè)任務(wù)共享的變量 1). 一個(gè)參數(shù)既可以是const還可以是volati

8、le嗎?解釋為什么。 2). 一個(gè)指針可以是volatile 嗎?解釋為什么。 3). 下面的函數(shù)有什么錯(cuò)誤: int square(volatile int *ptr) return *ptr * *ptr; Ptr內(nèi)容可能被修改,無(wú)法保證兩次取得同一個(gè)值,應(yīng)該先取出值放入一個(gè)變量中,然后通過(guò)這個(gè)變量來(lái)計(jì)算9. 嵌入式系統(tǒng)總是要用戶對(duì)變量或寄存器進(jìn)行位操作。給定一個(gè)整型變量a,寫兩段代碼,第一個(gè)設(shè)置a的bit 3,第二個(gè)清除a 的bit 3。在以上兩個(gè)操作中,要保持其它位不變。#define BIT3 (0x1 6) puts( 6) : puts(6 13. 評(píng)價(jià)下面的代碼片斷:unsig

9、ned int zero = 0; unsigned int compzero = 0xFFFF; /*1s complement of zero */14. 盡管不像非嵌入式計(jì)算機(jī)那么常見(jiàn),嵌入式系統(tǒng)還是有從堆(heap)中動(dòng)態(tài)分配內(nèi)存的過(guò)程的。那么嵌入式系統(tǒng)中,動(dòng)態(tài)分配內(nèi)存可能發(fā)生的問(wèn)題是什么?主要有三種類型:內(nèi)存泄露、內(nèi)存碎片和內(nèi)存崩潰 內(nèi)存崩潰是內(nèi)存使用最嚴(yán)重的結(jié)果,主要原因有數(shù)組訪問(wèn)越界、寫已經(jīng)釋放的內(nèi)存、指針計(jì)算錯(cuò)誤、訪問(wèn)堆棧地址越界等等。碎片收集的問(wèn)題,變量的持行時(shí)間等等下面的代碼片段的輸出是什么,為什么?char *ptr; if (ptr = (char *)malloc(0

10、) = NULL) puts(Got a null pointer); else puts(Got a valid pointer); 該代碼的輸出是“Got a valid pointer”。15. Typedef 在C語(yǔ)言中頻繁用以聲明一個(gè)已經(jīng)存在的數(shù)據(jù)類型的同義字。也可以用預(yù)處理器做類似的事。例如,思考一下下面的例子: #define dPS struct s * typedef struct s * tPS; 答案是:typedef更好。思考下面的例子: dPS p1,p2; tPS p3,p4;第一個(gè)擴(kuò)展為 struct s * p1, p2;上面的代碼定義p1為一個(gè)指向結(jié)構(gòu)的指,p

11、2為一個(gè)實(shí)際的結(jié)構(gòu),這也許不是你想要的。第二個(gè)例子正確地定義了p3 和p4 兩個(gè)指針。16. C語(yǔ)言同意一些令人震驚的結(jié)構(gòu),下面的結(jié)構(gòu)是合法的嗎,如果是它做些什么? int a = 5, b = 7, c; c = a+b;上面的代碼被處理成: c = a+ + b; 因此, 這段代碼持行后a = 6, b = 7, c = 12。 17.找錯(cuò)題試題1:void test1()char string10;char* str1 = 0123456789;strcpy( string, str1 ); 試題2:void test2()char string10, str110;int i;for(

12、i=0; i10; i+)str1i = a;strcpy( string, str1 ); 試題3:void test3(char* str1)char string10;if( strlen( str1 ) = 10 )strcpy( string, str1 ); 解答:試題1字符串str1需要11個(gè)字節(jié)才能存放下(包括末尾的0),而string只有10個(gè)字節(jié)的空間,strcpy會(huì)導(dǎo)致數(shù)組越界;對(duì)試題2,如果面試者指出字符數(shù)組str1不能在數(shù)組內(nèi)結(jié)束可以給3分;如果面試者指出strcpy(string, str1)調(diào)用使得從str1內(nèi)存起復(fù)制到string內(nèi)存起所復(fù)制的字節(jié)數(shù)具有不確定性

13、可以給7分,在此基礎(chǔ)上指出庫(kù)函數(shù)strcpy工作方式的給10分;對(duì)試題3,if(strlen(str1) = 10)應(yīng)改為if(strlen(str1) = - epsinon) & (x =”或“=”形式。如果寫成if (x = 0.0),則判為錯(cuò),得0分。23:以下為windows nt下的32位c+程序,請(qǐng)計(jì)算sizeof的值void func ( char str100 )sizeof( str ) = ?void *p = malloc( 100 );sizeof ( p ) = ? 解答:sizeof( str ) = 4sizeof ( p ) = 4 char str10;co

14、ut sizeof(str) endl; 24:寫一個(gè)“標(biāo)準(zhǔn)”宏min,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)。另外,當(dāng)你寫下面的代碼時(shí)會(huì)發(fā)生什么事?least = min(*p+, b); 解答:#define min(a,b) (a) = (b) ? (a) : (b) min(*p+, b)會(huì)產(chǎn)生宏的副作用25為什么標(biāo)準(zhǔn)頭文件都有類似以下的結(jié)構(gòu)? #ifndef _incvxworksh#define _incvxworksh #ifdef _cplusplusextern c #endif /*.*/ #ifdef _cplusplus#endif #endif /* _incvxwork

15、sh */ 解答:頭文件中的編譯宏#ifndef_incvxworksh#define_incvxworksh#endif 的作用是防止被重復(fù)引用。為了實(shí)現(xiàn)c和c+的混合編程,c+提供了c連接交換指定符號(hào)extern c來(lái)解決名字匹配問(wèn)題,函數(shù)聲明前加上extern c后,則編譯器就會(huì)按照c語(yǔ)言的方式將該函數(shù)編譯為_(kāi)foo,這樣c語(yǔ)言中就可以調(diào)用c+的函數(shù)了。26 編寫一個(gè)函數(shù),作用是把一個(gè)char組成的字符串循環(huán)右移n個(gè)。比如原來(lái)是“abcdefghi”如果n=2,移位后應(yīng)該是“hiabcdefgh” 函數(shù)頭是這樣的:/pstr是指向以0結(jié)尾的字符串的指針/steps是要求移動(dòng)的nvoid

16、loopmove ( char * pstr, int steps )/請(qǐng)?zhí)畛? 解答:正確解答1:void loopmove ( char *pstr, int steps )int n = strlen( pstr ) - steps;char tmpmax_len; strcpy ( tmp, pstr + n ); strcpy ( tmp + steps, pstr); *( tmp + strlen ( pstr ) ) = 0;strcpy( pstr, tmp ); 正確解答2:void loopmove ( char *pstr, int steps )int n = str

17、len( pstr ) - steps;char tmpmax_len; memcpy( tmp, pstr + n, steps ); memcpy(pstr + steps, pstr, n ); memcpy(pstr, tmp, steps ); 27 static關(guān)鍵字至少有下列n個(gè)作用:(1)函數(shù)體內(nèi)static變量的作用范圍為該函數(shù)體,不同于auto變量,該變量的內(nèi)存只被分配一次,因此其值在下次調(diào)用時(shí)仍維持上次的值;(2)在模塊內(nèi)的static全局變量可以被模塊內(nèi)所用函數(shù)訪問(wèn),但不能被模塊外其它函數(shù)訪問(wèn);(3)在模塊內(nèi)的static函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用,這個(gè)函數(shù)的使

18、用范圍被限制在聲明它的模塊內(nèi);28const關(guān)鍵字至少有下列n個(gè)作用:(1)欲阻止一個(gè)變量被改變,可以使用const關(guān)鍵字。在定義該const變量時(shí),通常需要對(duì)它進(jìn)行初始化,因?yàn)橐院缶蜎](méi)有機(jī)會(huì)再去改變它了;(2)對(duì)指針來(lái)說(shuō),可以指定指針本身為const,也可以指定指針?biāo)傅臄?shù)據(jù)為const,或二者同時(shí)指定為const;(3)在一個(gè)函數(shù)聲明中,const可以修飾形參,表明它是一個(gè)輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值;(4)對(duì)于類的成員函數(shù),若指定其為const類型,則表明其是一個(gè)常函數(shù),不能修改類的成員變量;29:請(qǐng)寫一個(gè)c函數(shù),若處理器是big_endian的,則返回0;若是little_endi

19、an的,則返回1解答:int checkcpu()union w int a;char b; c;c.a = 1;return (c.b = 1); 30. 堆和棧的區(qū)別?棧區(qū)(stack)- 由編譯器自動(dòng)分配釋放 ,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。堆區(qū)(heap) - 一般由程序員分配釋放, 若程序員不釋放,程序結(jié)束時(shí)可能由OS回收 。1) 從靜態(tài)存儲(chǔ)區(qū)域分配。內(nèi)存在程序編譯的時(shí)候就已經(jīng)分配好,這塊內(nèi)存在程序的整個(gè)運(yùn)行期間都存在。例如全局變量,static 變量。2) 在棧上創(chuàng)建。在執(zhí)行函數(shù)時(shí),函數(shù)內(nèi)局部變量的存儲(chǔ)單元都可以在棧上創(chuàng)建,函數(shù)執(zhí)行結(jié)束時(shí)這些存儲(chǔ)

20、單元自動(dòng)被釋放。棧內(nèi)存分配運(yùn)算內(nèi)置于處理器的指令集。3) 從堆上分配,亦稱動(dòng)態(tài)內(nèi)存分配。程序在運(yùn)行的時(shí)候用malloc 或new 申請(qǐng)任意多少的內(nèi)存,程序員自己負(fù)責(zé)在何時(shí)用free 或delete 釋放內(nèi)存。動(dòng)態(tài)內(nèi)存的生存期由程序員決定,使用非常靈活,但問(wèn)題也最多。31.struct 和 class 的區(qū)別答案:struct 的成員默認(rèn)是公有的,而類的成員默認(rèn)是私有的。struct 和 class 在其他方面是功能相當(dāng)?shù)摹?從感情上講,大多數(shù)的開(kāi)發(fā)者感到類和結(jié)構(gòu)有很大的差別。感覺(jué)上結(jié)構(gòu)僅僅象一堆缺乏封裝和功能的開(kāi)放的內(nèi)存位,而類就象活的并且可靠的社會(huì)成員,它有智能服務(wù),有牢固的封裝屏障和一個(gè)良

21、好定義的接口。既然大多數(shù)人都這么認(rèn)為,那么只有在你的類有很少的方法并且有公有數(shù)據(jù)(這種事情在良好設(shè)計(jì)的系統(tǒng)中是存在的!)時(shí),你也許應(yīng)該使用 struct 關(guān)鍵字,否則,你應(yīng)該使用 class 關(guān)鍵字。 32.#include stdafx.h#define SQR(X) X*Xint main(int argc, char* argv)int a = 10;int k = 2;int m = 1;a /= SQR(k+m)/SQR(k+m); printf(%dn,a); return 0;這道題目的結(jié)果是什么啊? 2+1*2+1/2+1*2+1=2+2+0.5+2+1=-33.const 符

22、號(hào)常量;(1)const char *p(2)char const *p(3)char * const p說(shuō)明上面三種描述的區(qū)別;如果const位于星號(hào)的左側(cè),則const就是用來(lái)修飾指針?biāo)赶虻淖兞浚粗羔樦赶驗(yàn)槌A?;如果const位于星號(hào)的右側(cè),const就是修飾指針本身,即指針本身是常量。(1)const char *p一個(gè)指向char類型的const對(duì)象指針,p不是常量,我們可以修改p的值,使其指向不同的char,但是不能改變它指向非char對(duì)象,如:const char *p;char c1=a;char c2=b;p=&c1;/okp=&c2;/ok*p=c1;/error(2)c

23、har const *p(3)char * const p這兩個(gè)好象是一樣的,此時(shí)*p可以修改,而p不能修改。(4)const char * const p這種是地址及指向?qū)ο蠖疾荒苄薷摹?4.下面是C語(yǔ)言中兩種if語(yǔ)句判斷方式。請(qǐng)問(wèn)哪種寫法更好?為什么?int n;if (n = 10) / 第一種判斷方式if (10 = n) / 第二種判斷方式如果少了個(gè)=號(hào),編譯時(shí)就會(huì)報(bào)錯(cuò),減少了出錯(cuò)的可能行,可以檢測(cè)出是否少了=35.寫出運(yùn)行結(jié)果:/ test2 union V struct X unsigned char s1:2;unsigned char s2:3;unsigned char s

24、3:3; x;unsigned char c; v; v.c = 100; printf(%d, v.x.s3); 3 /01136.用C+寫個(gè)程序,如何判斷一個(gè)操作系統(tǒng)是16位還是32位的?不能用sizeof()函數(shù)A1:16位的系統(tǒng)下,int i = 65536;cout i; / 輸出0;int i = 65535;cout i; / 輸出-1;32位的系統(tǒng)下,int i = 65536;cout i; / 輸出65536;int i = 65535;cout 65536 ) cout32 bitendl;else cout16 bitendl;37.C和C+有什么不同?從機(jī)制上:c是面

25、向過(guò)程的(但c也可以編寫面向?qū)ο蟮某绦颍?;c+是面向?qū)ο蟮?,提供了類。但是,c+編寫面向?qū)ο蟮某绦虮萩容易從適用的方向:c適合要求代碼體積小的,效率高的場(chǎng)合,如嵌入式;c+適合更上層的,復(fù)雜的; llinux核心大部分是c寫的,因?yàn)樗窍到y(tǒng)軟件,效率要求極高。從名稱上也可以看出,c+比c多了+,說(shuō)明c+是c的超集;那為什么不叫c+而叫c+呢,是因?yàn)閏+比c來(lái)說(shuō)擴(kuò)充的東西太多了,所以就在c后面放上兩個(gè)+;于是就成了c+C語(yǔ)言是結(jié)構(gòu)化編程語(yǔ)言,C+是面向?qū)ο缶幊陶Z(yǔ)言。C+側(cè)重于對(duì)象而不是過(guò)程,側(cè)重于類的設(shè)計(jì)而不是邏輯的設(shè)計(jì)。38.在不用第三方參數(shù)的情況下,交換兩個(gè)參數(shù)的值#include void

26、 main() int i=60; int j=50; i=i+j; j=i-j; i=i-j; printf(i=%dn,i); printf(j=%dn,j);方法二:i=j;j=i;i=j;方法三:/ 用加減實(shí)現(xiàn),而且不會(huì)溢出a = a+b-(b=a).進(jìn)程間通信的方式有?進(jìn)程間通信的方式有 共享內(nèi)存, 管道 ,Socket ,消息隊(duì)列 ,等39 struct A char t:4; char k:4; unsigned short i:8; unsigned long m; sizeof(A)=?(不考慮邊界對(duì)齊)740給定結(jié)構(gòu)struct A char t:4; char k:4;

27、unsigned short i:8; unsigned long m;問(wèn)sizeof(A) = ?給定結(jié)構(gòu)struct A char t:4; 4位 char k:4; 4位 unsigned short i:8; 8位 unsigned long m; / 偏移2字節(jié)保證4字節(jié)對(duì)齊; / 共8字節(jié)41下面的函數(shù)實(shí)現(xiàn)在一個(gè)固定的數(shù)上加上一個(gè)數(shù),有什么錯(cuò)誤,改正 int add_n(int n) static int i=100; i+=n; return i; 答:因?yàn)閟tatic使得i的值會(huì)保留上次的值。去掉static就可了42 union a int a_int1;double a_d

28、ouble;int a_int2;typedef structa a1;char y; b;class cdouble c_double;b b1;a a2;輸出coutsizeof(c)j+) & (i+ = j) i+=j;答:i = 544 unsigned short array=1,2,3,4,5,6,7;int i = 3;*(array + i) = ?答:445 試編寫函數(shù)判斷計(jì)算機(jī)的字節(jié)存儲(chǔ)順序是開(kāi)序(little endian)還是降序(bigendian)答:bool IsBigendian()unsigned short usData = 0x1122;unsigned

29、 char *pucData = (unsigned char*)&usData;return (*pucData = 0x22);46簡(jiǎn)述Critical Section和Mutex的不同點(diǎn)答:對(duì)幾種同步對(duì)象的總結(jié)1.Critical SectionA.速度快B.不能用于不同進(jìn)程C.不能進(jìn)行資源統(tǒng)計(jì)(每次只可以有一個(gè)線程對(duì)共享資源進(jìn)行存取)2.MutexA.速度慢B.可用于不同進(jìn)程C.不能進(jìn)行資源統(tǒng)計(jì)3.SemaphoreA.速度慢B.可用于不同進(jìn)程C.可進(jìn)行資源統(tǒng)計(jì)(可以讓一個(gè)或超過(guò)一個(gè)線程對(duì)共享資源進(jìn)行存取)4.EventA.速度慢B.可用于不同進(jìn)程C.可進(jìn)行資源統(tǒng)計(jì)47 請(qǐng)指出下列程序

30、中的錯(cuò)誤并且修改void GetMemory(char *p) p=(char *)malloc(100);void Test(void) char *str=NULL; GetMemory=(str); strcpy(str,hello world); printf(str);A:錯(cuò)誤-參數(shù)的值改變后,不會(huì)傳回GetMemory并不能傳遞動(dòng)態(tài)內(nèi)存,Test函數(shù)中的 str一直都是 NULL。strcpy(str, hello world);將使程序崩潰。修改如下:char *GetMemory() char *p=(char *)malloc(100); return p;void Test

31、(void) char *str=NULL; str=GetMemory() strcpy(str,hello world); printf(str);方法二:void GetMemory2(char *p)變?yōu)槎?jí)指針.void GetMemory2(char *p, int num)*p = (char *)malloc(sizeof(char) * num);48用C 寫一個(gè)輸入的整數(shù),倒著輸出整數(shù)的函數(shù),要求用遞歸方法 ;答:void fun( int a )printf( %d, a%10 );a /= 10;if( a =0 )return;fun( a );49.頭文件中的 if

32、ndef/define/endif 干什么用?預(yù)處理答:防止頭文件被重復(fù)引用50. i nclude 和 i nclude “filename.h” 有什么區(qū)別?答:前者用來(lái)包含開(kāi)發(fā)環(huán)境提供的庫(kù)頭文件,后者用來(lái)包含自己編寫的頭文件。51.在C+ 程序中調(diào)用被 C 編譯器編譯后的函數(shù),為什么要加 extern “C”聲明?答:函數(shù)和變量被C+編譯后在符號(hào)庫(kù)中的名字與C語(yǔ)言的不同,被extern C修飾的變量和函數(shù)是按照C語(yǔ)言方式編譯和連接的。由于編譯后的名字不同,C+程序不能直接調(diào)用C 函數(shù)。C+提供了一個(gè)C 連接交換指定符號(hào)extern“C”來(lái)解決這個(gè)問(wèn)題。52. 回答下面的問(wèn)題(6分)(1)

33、.Void GetMemory(char *p, int num)*p = (char *)malloc(num);void Test(void)char *str = NULL;GetMemory(&str, 100);strcpy(str, hello);printf(str);請(qǐng)問(wèn)運(yùn)行Test 函數(shù)會(huì)有什么樣的結(jié)果?答:輸出“hello”(2). void Test(void)char *str = (char *) malloc(100);strcpy(str, “hello”);free(str);if(str != NULL)strcpy(str, “world”);printf(

34、str);請(qǐng)問(wèn)運(yùn)行Test 函數(shù)會(huì)有什么樣的結(jié)果?答:輸出“world”(3). char *GetMemory(void)char p = hello world;return p;void Test(void)char *str = NULL;str = GetMemory();printf(str);請(qǐng)問(wèn)運(yùn)行Test 函數(shù)會(huì)有什么樣的結(jié)果?答:無(wú)效的指針,輸出不確定53. 編寫strcat函數(shù)(6分)已知strcat函數(shù)的原型是char *strcat (char *strDest, const char *strSrc);其中strDest 是目的字符串,strSrc 是源字符串。(1

35、)不調(diào)用C+/C 的字符串庫(kù)函數(shù),請(qǐng)編寫函數(shù) strcat答:char * strcat (char * dst, const char * src)char * cp = dst;while( *cp )cp+; /* find end of dst */while( *cp+ = *src+ ) ; /* Copy src to end of dst */return( dst ); /* return dst */(2)strcat能把strSrc 的內(nèi)容連接到strDest,為什么還要char * 類型的返回值?答:方便賦值給其他變量54.程序什么時(shí)候應(yīng)該使用線程,什么時(shí)候單線程效率高

36、。答:1耗時(shí)的操作使用線程,提高應(yīng)用程序響應(yīng)2并行操作時(shí)使用線程,如C/S架構(gòu)的服務(wù)器端并發(fā)線程響應(yīng)用戶的請(qǐng)求。3多CPU系統(tǒng)中,使用線程提高CPU利用率4改善程序結(jié)構(gòu)。一個(gè)既長(zhǎng)又復(fù)雜的進(jìn)程可以考慮分為多個(gè)線程,成為幾個(gè)獨(dú)立或半獨(dú)立的運(yùn)行部分,這樣的程序會(huì)利于理解和修改。其他情況都使用單線程。55.TCP/IP 建立連接的過(guò)程?(3-way shake)答:在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù),采用三次握手建立一個(gè)連接。第一次握手:建立連接時(shí),客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN

37、(ack=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);第三次握手:客戶端收到服務(wù)器的SYNACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手。56.ICMP是什么協(xié)議,處于哪一層?答:Internet控制報(bào)文協(xié)議,處于網(wǎng)絡(luò)層(IP層)57 winsock建立連接的主要實(shí)現(xiàn)步驟?答:服務(wù)器端:socker()建立套接字,綁定(bind)并監(jiān)聽(tīng)(listen),用accept()等待客戶端連接。客戶端:socker()建立套接字,連接(connect)服務(wù)器,

38、連接上后使用send()和recv(),在套接字上寫讀數(shù)據(jù),直至數(shù)據(jù)交換完畢,closesocket()關(guān)閉套接字。服務(wù)器端:accept()發(fā)現(xiàn)有客戶端連接,建立一個(gè)新的套接字,自身重新開(kāi)始等待連接。該新產(chǎn)生的套接字使用send()和recv()寫讀數(shù)據(jù),直至數(shù)據(jù)交換完畢,closesocket()關(guān)閉套接字。58 動(dòng)態(tài)連接庫(kù)的兩種方式?答:調(diào)用一個(gè)DLL中的函數(shù)有兩種方法:1載入時(shí)動(dòng)態(tài)鏈接(load-time dynamic linking),模塊非常明確調(diào)用某個(gè)導(dǎo)出函數(shù),使得他們就像本地函數(shù)一樣。這需要鏈接時(shí)鏈接那些函數(shù)所在DLL的導(dǎo)入庫(kù),導(dǎo)入庫(kù)向系統(tǒng)提供了載入DLL時(shí)所需的信息及DLL

39、函數(shù)定位。 2運(yùn)行時(shí)動(dòng)態(tài)鏈接(run-time dynamic linking),運(yùn)行時(shí)可以通過(guò)LoadLibrary或LoadLibraryEx函數(shù)載入DLL。DLL載入后,模塊可以通過(guò)調(diào)用GetProcAddress獲取DLL函數(shù)的出口地址,然后就可以通過(guò)返回的函數(shù)指針調(diào)用DLL函數(shù)了。如此即可避免導(dǎo)入庫(kù)文件了59 IP組播有那些好處?答:Internet上產(chǎn)生的許多新的應(yīng)用,特別是高帶寬的多媒體應(yīng)用,帶來(lái)了帶寬的急劇消耗和網(wǎng)絡(luò)擁擠問(wèn)題。組播是一種允許一個(gè)或多個(gè)發(fā)送者(組播源)發(fā)送單一的數(shù)據(jù)包到多個(gè)接收者(一次的,同時(shí)的)的網(wǎng)絡(luò)技術(shù)。組播可以大大的節(jié)省網(wǎng)絡(luò)帶寬,因?yàn)闊o(wú)論有多少個(gè)目標(biāo)地址,在

40、整個(gè)網(wǎng)絡(luò)的任何一條鏈路上只傳送單一的數(shù)據(jù)包。所以說(shuō)組播技術(shù)的核心就是針對(duì)如何節(jié)約網(wǎng)絡(luò)資源的前提下保證服務(wù)質(zhì)量。60.描述實(shí)時(shí)系統(tǒng)的基本特性 在特定時(shí)間內(nèi)完成特定的任務(wù),實(shí)時(shí)性與可靠性。61.全局變量和局部變量在內(nèi)存中是否有區(qū)別?如果有,是什么區(qū)別? 全局變量?jī)?chǔ)存在靜態(tài)數(shù)據(jù)庫(kù),局部變量在堆棧。62.什么是平衡二叉樹(shù)? 左右子樹(shù)都是平衡二叉樹(shù) 且左右子樹(shù)的深度差值的絕對(duì)值不大于1。63.堆棧溢出一般是由什么原因?qū)е碌模?沒(méi)有回收垃圾資源。64.冒泡排序算法的時(shí)間復(fù)雜度是什么? 時(shí)間復(fù)雜度是O(n2)。65.Internet采用哪種網(wǎng)絡(luò)協(xié)議?該協(xié)議的主要層次結(jié)構(gòu)? Tcp/Ip協(xié)議 主要層次結(jié)構(gòu)為:

41、 應(yīng)用層/傳輸層/網(wǎng)絡(luò)層/數(shù)據(jù)鏈路層/物理層。66.Internet物理地址和IP地址轉(zhuǎn)換采用什么協(xié)議? ARP (Address Resolution Protocol)(地址解析協(xié)議)67.IP地址的編碼分為哪倆部分? IP地址由兩部分組成,網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)。不過(guò)是要和“子網(wǎng)掩碼”按位與上之后才能區(qū)分哪些是網(wǎng)絡(luò)位哪些是主機(jī)位。68.不能做switch()的參數(shù)類型是:switch的參數(shù)不能為實(shí)型。注:必須是整數(shù)型常量,包括char,short,int,long等,不能是浮點(diǎn)數(shù)。Int main()Float a=3;Switch(a)Case 3:Printf(“a”);Return 0;/

42、error C2450: switch expression of type float is illegal69、局部變量能否和全局變量重名? 答:能,局部會(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)。70、如何引用一個(gè)已經(jīng)定義過(guò)的全局變量? 答:extern 可以用引用頭文件的方式,也可以用extern關(guān)鍵字,如果用引用頭文件方式來(lái)引用某個(gè)在頭文件中聲明的全局變理,假定你將那個(gè)變寫錯(cuò)了,那么在編譯期間會(huì)報(bào)錯(cuò),如果你用extern方式引用時(shí),假定你犯了同樣的錯(cuò)誤,那么在編譯期間不會(huì)報(bào)錯(cuò),而在連接期間報(bào)錯(cuò)。71、全局變量可不可以定義在可被多個(gè).C文件包含的頭文件中?為什么? 答:可以,在不同的C文件中以static形式來(lái)聲明同名全局變量。 可以在不同的C文件中聲明同名的全局變量,前提是其中只能有一個(gè)C文件中對(duì)此變量賦初值,此時(shí)連接不會(huì)出錯(cuò)。7

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(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)論