C語言面試題大匯總_第1頁
C語言面試題大匯總_第2頁
C語言面試題大匯總_第3頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C 語言面試題大匯總之華為面試題Eddy 整理1、局部變量能否和全局變量重名? 答:能,局部會屏蔽全局。要用全局變量,需要使用 ":" 局部變量可以與全 局 變量同名,在函數(shù)內(nèi)引用這個變量時,會用到同名的局部變量,而不會用到 全局 變量。對于有些編譯器而言,在同一個函數(shù)內(nèi)可以定義多個同名的局部變 量,比 如在兩個循環(huán)體內(nèi)都定義一個同名的局部變量,而那個局部變量的作用 域就在那 個循環(huán)體內(nèi)。2、如何引用一個已經(jīng)定義過的全局變量?答: extern 可以用引用頭文件的方式,也可以用 extern 關鍵字,如果用引用 頭 文件方式來引用某個在頭文件中聲明的全局變理,假定你將那個編

2、寫錯了,那 么在編譯期間會報錯,如果你用 extern 方式引用時,假定你犯了同樣的錯誤, 那么在編譯期間不會報錯,而在連接期間報錯。3、全局變量可不可以定義在可被多個 .C 文件包含的頭文件中?為什么? 答:可以,在不同的 C 文件中以 static 形式來聲明同名全局變量。 可以在 不同的 C 文件中聲明同名的全局變量,前提是其中只能有一個 C 文件中對此變 量賦初值,此時連接不會出錯 .4、請寫出下列代碼的輸出內(nèi)容#include <stdio.h>int main(void)int a,b,c,d;a=10;b=a+;c=+a;d=1O*a+;printf("b,

3、 c, d : %d, %d, %d", b, c, d); return 0;答:10, 12, 1205、static 全局變量與普通的全局變量有什么區(qū)別? static 局部變量和普通局部 變 量有什么區(qū)別? static 函數(shù)與普通函數(shù)有什么區(qū)別?答:1)全局變量 ( 外部變量 ) 的說明之前再冠以 static 就構成了靜態(tài)的全局變量。 全局變量本身就是靜態(tài)存儲方式,靜態(tài)全局變量當然也是靜態(tài)存儲方式。這兩 者在存儲方式上并無不同。這兩者的區(qū)別在于非靜態(tài)全局變量的作用域是整個 源 程序,當一個源程序由多個源文件組成時,非靜態(tài)的全局變量在各個源文件 中 都是有效的。而靜態(tài)全局變

4、量則限制了其作用域,即只在定義該變量的源文 件 內(nèi)有效,在同一源程序的其它源文件中不能使用它。由于靜態(tài)全局變量的作 用 域局限于一個源文件內(nèi),只能為該源文件內(nèi)的函數(shù)公用,因此可以避免在其 它 源文件中引起錯誤。2) 從以上分析可以看出,把局部變 量改變?yōu)殪o態(tài)變量后是改變了它的存儲 方式即改變了它的生存期。把全局變量 改變?yōu)殪o態(tài)變量后是改變了它的作用域, 限制了它的使用范圍。 3) static 函 數(shù)與普通函數(shù)作用域 不同, 僅在本文件。只在當前源文件中使用的函數(shù)應該說明為內(nèi)部函數(shù)(static),內(nèi)部函數(shù)應該在當前源文件中說明和定義。對于可在當前源文件以外使用的函 數(shù),應該在一個頭文件中說明

5、,要使用這些函數(shù)的源文件要包含這個頭文件 綜 上所述:static 全局變量與普通的全局變量有什么區(qū)別:static 全局變量只初使化一次,防止在其他文件單元中被引用;static 局部變量和普通局部變量有什么區(qū)別:static 局部變量只被初始化一次,下一次依據(jù)上一次結果值;static 函數(shù)與普通函數(shù)有什么區(qū)別:static 函數(shù)在內(nèi)存中只有 - ?份,普通函數(shù)在每個被調(diào)用中維持一份拷貝6、程序的局部變量存在于 ( 堆棧)中,全局變量存在于 ( 靜態(tài)區(qū))中,動態(tài)申 請 數(shù)據(jù)存在于 (堆) 中。7、設有以下說明和定義:typedef unionlong i;int k5;char c; DA

6、TE;struct dataint cat;DATE cow;double dog; too;DATE max;則語句 printf("%d",sizeof(struct data)+sizeof(max); 的執(zhí)行結果是: _52 _ 考點:區(qū)別 struct 與 union.( 般假定茬 32 位機器上)答:DATE是一個union,變量公用空間.里面最大的變量類型是int5,占用20個 字節(jié)所以它的大小是20. data是一個struct,每個變量分開占用空間依次為 int4 + DATE20 + doubles = 32. 所以結果是 20 + 32 = 52. 當

7、然. 在某些 16位 編輯器下,int可能是2字節(jié),那么結果是int2 + DATE10 + doubles = 208、隊列和棧有什么區(qū)別?隊列先進先出,棧后進先出9、寫出下列代碼的輸出內(nèi)容#include <stdio.h>int inc(int a)return(+a);int multi(int*a,int*b,int*c) return(*c=*a*b);typedef int(FUNC1)(int in); typedef int(FUNC2) (int*,int*,int*);void show(FUNC2 fun,int arg1, int*arg2)FUNC1 p

8、=&inc;int temp =p(arg1);fun(&temp,&arg1, arg2); printf("%dn",*arg2);main()int a; 局部變量 a 為 0;show(multi,10,&a);return 0; 答:11010、請找出下面代碼中的所有錯誤(題目不錯,值得看) 說明:以下代碼是把一個字符串倒序,如“abed”序后變?yōu)椤癲eba”#include"string.h"main()char*src="hello,world"char* dest=NULL;int le

9、n=strlen(src); dest=(char*)malloc(len); char* d=dest;char* s=srclen; while(len-!=0) d+=s-;printf("%s",dest);return 0;答:方法 1 : 一共有 4 個錯誤;int main()char* sre = "hello,world"int len = strlen(src);char* dest = (char*)malloc(len+1);/ 要為分配一個空間char* d = dest;char* s = &srclen-1;指向最后

10、一個字符while( len- != 0 )*d+=*s-;*d = 0;尾部要加 '/O'printf("%sn",dest);free(dest);/ 使用完,應當釋放空間,以免造成內(nèi)存匯泄露dest = NULL; 防止產(chǎn)生野指針return 0;方法 2:( 方法一需要額外的存儲空間,效率不高 .) 不錯的想法 #include <stdio.h>#include <string.h>main()char str="hello,world"int len=strlen(str);char t;for(int

11、 i=0; i<len/2; i+)t=stri;stri=strlen-i-1; 小心一點strlen-i-1=t;printf("%s",str);return 0;)C+中應用11 . 對于一個頻繁使用的短小函數(shù),在 C 語言中應用什么實現(xiàn),在 什么 實現(xiàn)?c 用宏定義, C+ 用 inline12. 直接鏈接兩個信令點的一組鏈路稱作什么 ?PPP 點到點連接13. 接入網(wǎng)用的是什么接口?V5 接口14. voip 都用了那些協(xié)議?H.323 協(xié)議簇、 SIP 協(xié)議、 Skype 協(xié)議、 H.248 和 MGCP 協(xié)議15. 軟件測試都有那些種類? 黑盒:針對系

12、統(tǒng)功能的測試 白盒:測試函數(shù)功能,各函數(shù)接口16. 確定模塊的功能和模塊的接口是在軟件設計的那個隊段完成的? 概要設計階段17.unsigned char *p1;unsigned long *p2;p1=(unsigned char *)0x801000;p2=(unsigned long *)0x810000;請問 p1+5=; p2+5= ;答案:0x801005(相當于加上5位)0x810014(相當于加上20位);選擇題:21 .Ethternet 鏈接到 Internet 用到以下那個協(xié)議? D A.HDLC;B.ARP;C.UDP;D.TCP;E.ID22. 屬于網(wǎng)絡層協(xié)議的是

13、:( B C)23. Windows 消息調(diào)度機制是 :(C)A.指令隊列;B.指令堆棧;C.消息隊列;D.消息堆棧;找錯題:25. 請問下面程序有什么錯誤?int a602501000,i,j,k;for(k=0;kMax_GT_Length) return GT_Length_ERROR;答:死循環(huán) 問答題: 29.IP Phone 的原理是什么?IP電話(又稱IP PHONE或VoIP)是建立在IP技術上的分組化、數(shù)字化傳 輸技術,其基本原理是:通過語音壓縮算法對語音數(shù)據(jù)進行壓縮編碼處理,然 后把 這些語音數(shù)據(jù)按 IP 等相關協(xié)議進行打包,經(jīng)過 IP 網(wǎng)絡把數(shù)據(jù)包傳輸?shù)浇?收地,再 把這

14、些語音數(shù)據(jù)包串起來 , 經(jīng)過解碼解壓處理后,恢復成原來的語音 信號,從而達 到由IP網(wǎng)絡傳送語音的目的。30.TCP/IP 通信建立的過程怎樣,端口有什么作用?三次握手,確定是哪個應用程序使用該協(xié)議31.1 號信令和 7 號信令有什么區(qū)別,我國某前廣泛使用的是那一種?1 號信令接續(xù)慢,但是穩(wěn)定,可靠。7 號信令的特點是:信令速度快,具有提供大量信令的潛力,具有改變和增 加信令的靈活性,便于開放新業(yè)務,在通話時可以隨意處理信令,成本低。 目 前得到廣泛應用。32.列舉 5 種以上的電話新業(yè)務 如“鬧鐘服務”、“免干擾服務”、“熱線服務”、“轉移呼叫”、“遇忙回 叫”、“缺席用 戶服務”、“追查惡

15、意呼叫”、“三方通話”、“會議電 話”、“呼出限制”、“來電顯示”、 “虛擬網(wǎng)電話”等四. 找錯題:1. 請問下面程序有什么錯誤?int a602501000,i,j,k; for(k=0;k<=1000;k+) for(j=0;j<250;j+) for(i=0;i<60;i+) aijk=O; 答:把循環(huán)語句內(nèi)外換 -?下2. #define Max_CB 500 void LmiQueryCSmd(Struct MSgCB * pmsg) unsigned char ucCmdNum;for(ucCmdNum=0;ucCmdNum<Max_CB;ucCmdNum+

16、)答:死循環(huán) .unsigned int 的取值范圍是 0-2553. 以下是求一個數(shù)的平方的程序 , 請找出錯誤:#define SQUARE(a)(a)*(a)int a=5;int b;b=SQUARE(a+);答: 結果與編譯器相關,得到的可能不是平方值 . 微軟亞洲技術中心的面試題 !1. 進程和線程的差別。 答:線程是指進程內(nèi)的一個執(zhí)行單元 , 也是進程內(nèi)的可調(diào)度實體 . 與進程的區(qū)別:(1) 調(diào)度:線程作為調(diào)度和分配的基本單位,進程作為擁有資源的基本單位(2) 并發(fā)性:不僅進程之間可以并發(fā)執(zhí)行,同一個進程的多個線程之間也可并 發(fā) 執(zhí)行(3) 擁有資源:進程是擁有資源的一個獨立單位

17、,線程不擁有系統(tǒng)資源,但可 以 訪問隸屬于進程的資源 .(4) 系統(tǒng)開銷:在創(chuàng)建或撤消進程時,由于系統(tǒng)都要為之分配和回收資源,導 致 系統(tǒng)的開銷明顯大于創(chuàng)建或撤消線程時的開銷。2. 測試方法答: 人工測試:個人復查、抽查和會審 機器測試:黑盒測試和白盒測試3. Heap 與 stack 的差別。答: Heap 是堆, stack 是棧。Stack 的空間由操作系統(tǒng)自動分配 /釋放, Heap 上的空間手動分配 / 釋放。 Stack 空間有限, Heap 是很大的自由存儲區(qū)C 中的 malloc 函數(shù)分配的內(nèi)存空間即在堆上 , C+ 中對應的是 new 操作符。 程序在編譯期對變量和函數(shù)分配內(nèi)

18、存都在棧上進行,且程序運行過程中函數(shù)調(diào) 用時參數(shù)的傳遞也在棧上進行4. Windows 下的內(nèi)存是如何管理的? 分頁管理8. 談談 IA32 下的分頁機制 小頁(4K)兩級分頁模式,大頁(4M) 級9. 給兩個變量,如何找出一個帶環(huán)單鏈表中是什么地方出現(xiàn)環(huán)的? 一個遞增一,一個遞增二,他們指向同一個接點時就是環(huán)出現(xiàn)的地方10. 在 IA32 中一共有多少種辦法從用戶態(tài)跳到內(nèi)核態(tài)? 通過調(diào)用門,從 ring3 到 ringO, 中斷從 ring3 到 ringO, 進入 vm86 等等11. 如果只想讓程序有一個實例運行,不能運行兩個。像 winamp - 樣,只能開一個窗口,怎樣實現(xiàn)?用內(nèi)存映

19、射或全局原子(互斥變量)、查找窗口句柄 .FindWindow, 互斥,寫標志到文件或注冊表 , 共享內(nèi)存。 .12. 如何截取鍵盤的響應,讓所有的'a ,變成'b,?答: 鍵盤鉤子 SetWindowsHookEx14. 存儲過程是什么?有什么用?有什么優(yōu)點?答: 我的理解就是一堆 sql 的集合,可以建立非常復雜的查詢,編譯運行,所 以運行一次后,以后再運行速度比單獨執(zhí)行 SQL 快很多15. Template 有什么特點?什么時候用?答:Template可以獨立于任何特定的類型編寫代碼,是泛型編程的基礎. 當我們編寫的類和函數(shù)能夠多態(tài)的用于跨越編譯時不相關的類型時,用 T

20、emplate.模板主要用于 STL 中的容器,算法,迭代器等以及模板元編程 .(C+ 的 template 是實現(xiàn)在庫設計和嵌入式設計中的關鍵。template 能實現(xiàn)抽象和效率的結合;同時 template 還能有效地防止代碼膨 脹)16. 談談 Windows DNA 結構的特點和優(yōu)點。答: Windows Distributed interNet Application Architecture (Windows 分布 式 應用結構,簡稱 Windows DNA )是微軟創(chuàng)建新一代高適應性商業(yè)解決方 案的 框架,它使公司能夠充分地挖掘數(shù)字神經(jīng)系統(tǒng)的優(yōu)點。 Windows DNA 是第一

21、 個將 Internet, 客戶/ 服務器、和用于計算的 PC 模型結合并集成在一 起的為 新一類分布式計算方案而設計的應用軟件體系結構17. 網(wǎng)絡編程中設計并發(fā)服務器,使用多進程與多線程,請問有什么區(qū)別?答 :1 )進程:子進程是父進程的復制品。子進程獲得父進程數(shù)據(jù)空間、堆和 棧的 復制品。2)線程:相對與進程而言,線程是一個更加接近與執(zhí)行體的概念,它可以 與 同進程的其他線程共享數(shù)據(jù),但擁有自己的??臻g,擁有獨立的執(zhí)行序列。兩者都可以提高程序的并發(fā)度,提高程序運行效率和響應時間。 線程和進程在使用上各有優(yōu)缺點:線程執(zhí)行開銷小,但不利于資源管理和保 護; 而進程正相反。同時,線程適合于在 S

22、MP 機器上運行,而進程則可以跨 機器遷 移。思科1. 用宏定義寫出 swap (x, y)答#define swap ( x, y)x = x + y;y = x-y ;x = x - y;2. 數(shù)組 aN, 存放了 1 至 N-1 個數(shù),其中某個數(shù)重復一次。寫一個函數(shù),找出 被 重復的數(shù)字 . 時間復雜度必須為 o (N) 函數(shù)原型:int do_dup(int a,int N)答: int do_dup(int a,int N)未經(jīng)調(diào)試int sun = 0;int sum2;for(int i=0;i<N;+i)(Sum+=ai;Sum2 = (1+N-1)*N/2;Return

23、 (sum-sum2);3 一語句實現(xiàn) x 是否為 2 的若干次驀的判斷答:方法 1)int 1 = 512;cout? boolalpha ? (i & (i -1) ? false : true) ? endl; 位與為 0,則表示是 2 的 若干次幕2) return (x? N=1);4. unsigned int intvert(unsigned int x,int p,int n) 實現(xiàn)對 x 的進行轉換 ,p 為 起始轉 化位,n為需要轉換的長度,假設起始點在右邊.如x=ObOOO10001 ,p=4,n=3 轉換后 x=0b0110 0001答:unsigned int

24、 intvert(unsigned int x,int p,int n) 假定 p=4,n=3unsigned int_t = O;unsigned int_a = 1;for(int i = O; i < n; +i) 循環(huán)的目的主要是 -t_t |= _a; 位或_a = _a ? 1;_t = _t ? p;轉換后 _t 變?yōu)?111OOOOx A= _t; return x; 慧通:/ 異或,將原來的位取反1.什么是預編譯,何時需要預編譯:答:就是指程序執(zhí)行前的一些預處理工作,主要指 #表示的 . 何時需要預編譯?1) 、總是使用不經(jīng)常改動的大型代碼體。2) 、程序由多個模塊組成

25、,所有模塊都使用一組標準的包含文件和相同的編 譯選項。在這種情況下,可以將所有包含文件預編譯為個預編譯頭。2. 下述三個有什么區(qū)別? char * const p;char const * p const char *p 解答:char * const p; 常量指針, p 的值不可以修改char const * p ; / 指向常量南指針,指向的常量值不可以改const char *p ; 和 char const *p3. 解釋下列輸出結果 char str1 = "abc"char str2 = "abc" const char str3 = &q

26、uot;abc" const char str4 = "abc" const char *str5 = "abc" const char *str6 = "abc"char *str7 = "abc" char *str8 = "abc"cout? ( str1 = str2 ) ? endl; cout? ( str3 = str4 ) ? endl; cout? ( str5 = str6 ) ? endl; cout? ( str7 = str8 ) ? endl;結果是: 00

27、 11解答: str1 ,str2,str3,str4 是數(shù)組變量,它們有各自的內(nèi)存空間; 而 str5,str6,str7,str8 是指針,它們指向相同的常量區(qū)域。4. 以下代碼中的兩個 sizeof 用法有問題嗎? C 易void UpperCase( char str) / 將 str 中的小寫字母轉換成大寫字母for( size_t i=0; i<sizeof(str)/sizeof(str0); +i)if( 'a'<=stri && stri<='z')stri -= ('a'-'A'

28、;);char str = "aBcDe"cout? "str 字符長度為: "? sizeof(str)/sizeof(str0) ? endl;UpperCase( str);cout? str? endl;答:函數(shù)內(nèi)的 sizeof 有問題。根據(jù)語法, sizeof 如用于數(shù)組,只能測出靜態(tài)數(shù) 組 的大小,無法檢測動態(tài)分配的或外部數(shù)組大小。函數(shù)外的 str 是一個靜態(tài)定 義的 數(shù)組,因此其大小為 6, 函數(shù)內(nèi)的 str 實際只是一個指向字符串的指針,沒 有任 何額外的與數(shù)組相關的信息,因此 sizeof 作用于上只將其當指針看,一個 指針 為 4

29、個字節(jié),因此返回 4。注意:數(shù)組名作為函數(shù)參數(shù)時 ,退化為指針 . 數(shù)組名作為 sizeof() 參數(shù)時,數(shù)組名不退化,因為 sizeof 不是函數(shù) .4. 一個 32 位的機器,該機器的指針是多少位 指針是多少位只要看地址總線的位數(shù)就行了。 80386 以后的機子都是 32 的數(shù)據(jù) 總 線。所以指針的位數(shù)就是 4 個字節(jié)了。5. 指出下面代碼的輸出,并解釋為什么。 ( 不錯,對地址掌握的深入挖潛 ) main() int a5=1,2,3,4,5;int *ptr=(int *)(&a+1);printf("%d )%d",*(a+1),*(ptr-1);)輸出:

30、 2,5*(a+1)就是a1, *(ptr-1)就是a4,執(zhí)行結果是2, 5&a+1不是首地址+1,系統(tǒng)會認為加一個a數(shù)組的偏移,是偏移了一個數(shù)組的大 小( 本例是 5 個 int)int *ptr=(int *)(&a+1);則ptr實際是&(a5),也就是a+5原菌如下:&a 是數(shù)組指針,其類型為 int (*)5;而指針加 1 要根據(jù)指針類型加上一定的值, 不同類型的指針 +1 之后增加的大小不同 a 是長度為 5 的 int 數(shù)組指針,所以要加 5*sizeof(int)所以 ptr 實際是 a5但是prt與(&a+1)類型是不一樣的(這點很重要

31、)所以 prt-1 只會減去 sizeof(int*)a &a的地址是一樣的,但意思不樣,a是數(shù)組首地址,也就是a0的地址, &a 是對象(數(shù)組)首地址, a+1 是數(shù)組下一元素的地址,即 a1,&a+1 是下一個 對象的地址,即 a5,6. 請問以下代碼有什么問題: int main()char a;char *str=&a;strcpy(str,"hello");printf(str);return 0;答;沒有為str分配內(nèi)存空間,將會發(fā)生異常 問題出在將一個字符串復制進一個字符變量指針所指地址。雖然可以正確輸 出 結果,但因為越界進行

32、內(nèi)在讀寫而導致程序崩潰。Strcpy 的在庫函數(shù) string.h 中. 程序的主要錯誤在于越界進行內(nèi)存讀寫導致程 序 崩潰2).char* s="AAA"printf("%s",s);s0='B'printf("%s",s);有什么錯?答:"AAA"是字符串常量。s是指針,指向這個字符串常量,所以聲明s的時候就 有問題。cosnt char* s="AAA"然后又因為是常量,所以對是s0的賦值操作是不合法的。1 、寫一個“標準,宏,這個宏輸入兩個參數(shù)并返回較小的一個 答:# d

33、efine Min(X, Y) (X)>(Y)?(Y):(X) 結尾沒有;2、嵌入式系統(tǒng)中經(jīng)常要用到無限循環(huán),你怎么用 C 編寫死循環(huán)。答: while(1) 或者 for(;) 前面那個較好3、關鍵字 static 的出角是什么? 答:1)定義靜態(tài)局部變量 , 作用域從函數(shù)開始到結束 .2) 在模塊內(nèi)的 static 函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用,這個函數(shù)的使用 范圍被限制在聲明它的模塊內(nèi);3) 在類中的 static 成員變量屬于整個類所擁有,對類的所有對象只有一份拷貝4、關鍵字 const 有什么含意? 答:1)表示常量不可以修改的變量。2) 可以修飾參數(shù),作為輸入?yún)?shù) .3

34、) 修飾函數(shù),防止以外的改動 .4) 修飾類的成員函數(shù),不改變類中的數(shù)據(jù)成員 .5、關鍵字 volatile 有什么含意?并舉出三個不同的例子? 答:提示編譯器對象的值可能在編譯器未監(jiān)測到的情況下改變。例子:硬件時鐘 ; 多線程中被多個任務共享的變量等6、int (*s10)(int) 表示的是什么啊int (*s10)(int) 函數(shù)指針數(shù)組,每個指針指向一個 int func(int param) 的函數(shù)1 . 有以下表達式:int a=248; b=4;int const c=21 ;const int *d=&a;int *const e=&b;int const *f

35、 const =&a; 請問下列表達式哪些會被編譯器禁止?為什么? 答:* c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;*c 這是個什么東東,禁止*d 說了是 const, 禁止e = &a 說了是 const 禁止const *f const =&a; 禁止2. 交換兩個變量的值,不使用第三個變量。即 a=3,b=5, 交換之后 a=5,b=3; 答: 有兩種解法,一種用算術算法,一種用人 ( 異或) a = a + b;b = a - b;a = a - b;ora = a Ab;/ 只能對 int,char.b = a A

36、b;a = a Ab;ora A= b A= a;3. c 和 C+ 中的 struct 有什么不同?答:c和C+中struct的主要區(qū)別是c中的struct不可以含有成員函數(shù),而 C+ 中的 struct 可以。 C+ 中 struct 和 class 的主要區(qū)別在于默認的存取權限不同struct 默認為 public,而 class 默認為 private.4. #inelude <stdio.h>#i nclude <stdlib.h>void getmemory(char *p)p=(char *) malloc(100);int mai n()char *st

37、r=NULL;getmemory(str);strcpy(p,"hello world");prin tf("%s/n",str);free(str);return 0;)答:程序崩潰,getmemory中的malloc不能返回動態(tài)內(nèi)存,free ()對str操 作 很危險5. char szstr10;strcpy(szstr,"0123456789");產(chǎn)生什么結果?為什么?答;正常輸出,長度不一樣,會造成非法的OS,覆蓋別的內(nèi)容.6. 列舉幾種進程的同步機制,并比較其優(yōu)缺點。答:原子操作信號量機制自旋鎖管程,會合,分布式系統(tǒng)7.

38、 進程之間通信的途徑答共享存儲系統(tǒng)消息傳遞系統(tǒng)管道:以文件系統(tǒng)為基礎面試經(jīng)典試題silver6 | 02 一月,2007 11:41面試經(jīng)典試題Author : Vince即使你是個編程高手,你在面試前也應該要看看這套題,她也許會給你 帶來好運,否則你有可能后悔當初為什么沒有看而跳樓自殺,這樣我會很內(nèi)疚的。這套題看似簡單,但你未必能得高分,即使你看不懂也要把她背下來! 歡迎轉載此文,轉載時請注明文章來源:文斯測試技術研究中心 n.n et/vi ncetest1 編程基礎1.1基本概念1. const 的理解: const char*, char const*, char*const 的區(qū)別問

39、題幾乎是 C+ 面試中每次都會有的題目。事實上這個概念誰都有只是三種聲明方式非常相似 很容易記混。 Bjarne 在他的 The C+ Programming Language 里面給出過一個 助記的方法:把一個聲明從右向左讀。 ' 'char * const cp; (* 讀成 pointer to ) cp is a const pointer to char const char * p; p is a pointer to const char;char const * p;同上因為C+里面沒有con st*的運算符,所以con st只能屬于前面的類型。2. c 指針i

40、nt *pn; 指針數(shù)組,每個元素均為指向整型數(shù)據(jù)的指針。int (*p)n; p 為指向 - 一維數(shù)組的指針,這個一維數(shù)組有 n 個整型數(shù)據(jù)。int *p(); 函數(shù)帶回指針,指針指向返回的值。int (*p)(); p 為指向函數(shù)的指針。3. 數(shù)組越界問題 ( 這個題目還是有點小險的 ) 下面這個程序執(zhí)行后會有什么錯 誤或者效果: #define MAX 255int main()unsigned char AMAX,i;for (i=0;i<=MAX;i+)Ai=i;解答:MAX=255,數(shù)組A的下標范圍為:0.MAX-1,這是其一,其二 當i循環(huán)到255 時,循環(huán)內(nèi)執(zhí)行 :A25

41、5=255; 這句本身沒有問題,但是返回 for (i=0;i<=MAX;i+) 語句時,由于 unsigned char 的取值范圍在 (O.255),i+ 以后 i 又房 0 了. 無限循環(huán)下 去.注: char 類型為一個字節(jié),取值范圍是 -128, 127, unsigned char 0 ,2554. C+:memset ,memcpy 和 strcpy 的根本區(qū)別?答:# include "memory.h"memset 用來對一段內(nèi)存空間全部設置為某個字符,一般用在對定義的字符串進 行初始化為 '' 或”;例 :char a100;mem

42、set(a,", sizeof(a);memcpy 用來做內(nèi)存拷貝,你可以拿它拷貝任何數(shù)據(jù)類型的對象,可以指定拷 貝 的數(shù)據(jù)長度;例: char a100,b50; memcpy(b, a, sizeof(b); 注意如用 sizeof(a), 會造成 b 的內(nèi)存地址溢出。strcpy 就只能拷貝字符串了,它遇到 70' 就結束拷貝;例: char a100,b50;strcpy(a,b); 如用 strcpy(b,a), 要注意 a 中的字符串長度 ( 第一個 70' 之前 ) 是否超過 50 位,如超過,則會造成 b 的內(nèi)存地址溢出。strcpy原型: exter

43、n char *strcpy(char *dest,char *src);ASSERT(dest!=NULL)&&(src!=NULL);Char *address = dest;While(*dest+=*src+) !=70 ,)Continue;Return dest;用法: #include <string.h>功能:把 src 所指由 NULL 結束的字符串復制到 dest 所指的數(shù)組中。說明: src 和 dest 所指內(nèi)存區(qū)域不可以重疊且 dest 必須有足夠的空間來容納 src 的字符串。返回指向 dest 的指針。 memcpy原型: extern

44、 void *memcpy(void *dest, void *src, unsigned int count); ASSERT(dest!=NULL)&&(src!=NULL); ASSERT(dest>src+count)|(src>dest+count);/ 防止內(nèi)存重疊,也可以 用 restrict 修飾指針Byte* bdest = (Byte*)dest;Byte* bsrc = (Byte*) src;While(count->0)*bdest+ = *bsrc+;Return dest;用法: #include <memory.h>

45、功能:由 src 所指內(nèi)存區(qū)域復制 count 個字節(jié)到 dest 所指內(nèi)存區(qū)域。 說明: src 和 dest 所指內(nèi)存區(qū)域不能重疊,函數(shù)返回指向 dest 的指針。 Memset原型: extern void *memset(void *buffer, char c, int count);用法: #include功能:把 buffer 所指內(nèi)存區(qū)域的前 count 個字節(jié)設置成字符 c 。 說明:返回指向 buffer 的指針。5. ASSERT() 是干什么用的答: ASSERT() 是一個調(diào)試程序時經(jīng)常使用的宏,在程序運行時它計算括號內(nèi)的 表 達式,如果表達式為 FALSE (0),

46、 程序將報告錯誤,并終止執(zhí)行。如果表達式 不 為 0, 則繼續(xù)執(zhí)行后面的語句。這個宏通常原來判斷程序中是否出現(xiàn)了明顯非 法 的數(shù)據(jù),如果出現(xiàn)了終止程序以免導致嚴重后果,同時也便于查找錯誤。例 如, 變量 n 在程序中不應該為 0,如果為 0 可能導致錯誤,你可以這樣寫程序:ASSERT( n != 0); k= 10/n;ASSERT 只有在 Debug 版本中才有效,如果編譯為 Release 版本則被忽略。 assert() 的功能類似,它是 ANSI C 標準中規(guī)定的函數(shù),它與 ASSERT 的一個重 要區(qū)別是可以用在 Release 版本中。6. system ("pause

47、"); 作用?答: 系統(tǒng)的暫停程序,按任意鍵繼續(xù),屏幕會打印, " 按任意鍵繼續(xù) OOOOO 省去T 使用 getchar () ;7. 請問 C+ 的類和 C 里面的 struct 有什么區(qū)別?答:C+中的類具有成員保護功能,并且具有繼承,多態(tài)這類。0特點,而C里的 struct 沒有c 里面的 struct 沒有成員函數(shù),不能繼承,派生等等 .8. 請講一講析構函數(shù)和虛函數(shù)的用法和作用?答: 析構函數(shù)也是特殊的類成員函數(shù),它沒有返回類型,沒有參數(shù),不能隨意調(diào) 用,也沒有重載。只是在類對象生命期結束的時候,由系統(tǒng)自動調(diào)用釋放在 構 造函數(shù)中分配的資源。這種在運行時,能依據(jù)

48、其類型確認調(diào)用那個函數(shù)的 能力 稱為多態(tài)性,或稱遲后聯(lián)編。另:析構函數(shù)一般在對象撤消前做收尾工 作, 比如回收內(nèi)存等工作, 虛擬函數(shù)的功能是使子類可以用同名的函數(shù)對父類函數(shù)進行覆蓋,并且在調(diào) 用 時自動調(diào)用子類覆蓋函數(shù),如果是純虛函數(shù),則純粹是為了在子類覆蓋時 有個 統(tǒng)一的命名而已。注意 : 子類重新定義父類的虛函數(shù)的做法叫覆蓋 .override, 而不是 overload( 重 載),重載的概念不屬于面向對象編程,重載指的是存在多個同名函數(shù),這些 函數(shù) 的參數(shù)表不同 . 重載是在編譯期間就決定了的,是靜態(tài)的,因此,重載 與多態(tài)無關 . 與面向對象編程無關 . 含有純虛函數(shù)的類稱為抽象類,不

49、能實例化對象,主要用作接口類9. 全局變量和局部變量有什么區(qū)別?是怎么實現(xiàn)的?操作系統(tǒng)和編譯器是怎么 知道的?答; 全局變量的生命周期是整個程序運行的時間,而局部變量的生命周期則是局 部函數(shù)或過程調(diào)用的時間段。其實現(xiàn)是由編譯器在編譯時采用不同內(nèi)存分配方 法。全局變量在 main 函數(shù)調(diào)用后,就開始分配, 靜態(tài)變量則是在 main 函數(shù)前就已經(jīng)初始化了。 局部變量則是在用戶棧中動態(tài)分配的 ( 還是建議看編譯原理中的活動記錄這 一塊)10. 8086 是多少位的系統(tǒng)?在數(shù)據(jù)總線上是怎么實現(xiàn)的?答:8086 系統(tǒng)是 16 位系統(tǒng),其數(shù)據(jù)總線是 20 位。12 程序設計1. 編寫用 C 語言實現(xiàn)的求

50、n 階階乘問題的遞歸算法:答:long int fact(i nt n)''|f(n=0|n=1)Return 1;ElseReturn n*fact(n-1);2. 二分查找算法:1) 遞歸方法實現(xiàn):int BSearch(elemtype a,elemtype x,int low,int high)/* 在下屆為 low, ±界為 high 的改組 a 中折半查找數(shù)據(jù)元素 x7int mid; if(low>high) return -1; mid=(low+high)/2; if(x=amid) return mid; if(x<amid) retu

51、rn(BSearch(a,x,low,mid-1); else return(BSearch(a,x,mid+1 ,high);)2) 非遞歸方法實現(xiàn):int BSearch(elemtype a,keytype key,int n) int low,high,mid; low=0;high=n-1; while(low<=high) mid=(low+high)/2; if(amid.key=key) return mid; else if(amid.key<key) low=mid+1; else high=mid-1; return -1;3. 遞歸計算如下遞歸函數(shù)的值 (斐

52、波拉契 ):f=1 f(2)=1 f(n)=f(n-1)+f(n-2) n>2 解:非遞歸算法: int f(int n) int i,s,s1,s2; s1=1;/*s1 用于保存 f(n-1) 的值*/ s2=1 ;/*s2用于保存f(n-2)的值*/s=1;for(i=3;i<=n;i+) s=s1+s2;s2=s1;s1=s;) return(s); 遞歸算法: Int f(int n) lf(n=1 |n=2)Rerurn 1;ElseRerutn f(n-1)+f(n-2);4. 交換兩個數(shù),不用第三塊兒內(nèi)存: 答:int a =.;int b = ;a = a + b

53、;b = a - b;a = a - b;時間復雜度為 0(n*n);5. 冒泡排序:答: void BubbleSort(elemtype x,int n)int i,j ;elemtype temp; for(i=1 ;i<n;i+) for(j=0;j<n-i;j+) if(xj.key>xj+1.key)( temp=xj; xj=xj+1; xj+1=temp;補充一個改進的冒泡算法:void BubbleSort(elemtype x,int n)Int i,j;BOOL exchange; 記錄交換標志 for(i=1 ;i<n;+i) 最多做 n-1 趟

54、排序 Exchange = false;For(j=n-1;j>=i;-j) lf(xj>xj+1)x0 = xj;Xj = xj+1;Xj+1 = x0;Exchange = true; 發(fā)生了交換,設置標志為真 if (!Exchange )為發(fā)生替換,提前終止算法return;6. c 語言文件讀寫 #include "stdio.h" main()FILE *fp;char ch,filename10; scanf("%s",filename); if(fp=fopen(filename,"w")=NULL) pr

55、intf("cann't open filen"); exit(O);ch=getchar(); while(ch!='#')fputc(ch,fp); putchar(ch);ch=getchar(); fclose(fp);7. winsocket 編程這個不錯/ 服務器代碼#include <Winsock2.h>#include <stdio.h> void main() WORD wVersionRequested; 版本號 WSADATA wsaData; 數(shù)據(jù) int err; wVersion Requeste

56、d = MAKEWORD(1,1); err = WSAStartup(wVersion Requested,&wsaData); if( err != 0) return; if(LOBYTE( wsaData.wVersion ) != 1| HI BYTE ( wsaData.wVersion) != 1) WSACIeanup(); return;建立套接字綁定端口SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); SOCKADDRJN addrSrv;addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_A

57、NY); addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000); bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR); listen(sockSrv,5); 轉換 socket 套接子為偵聽套接子 SOCKADDRJN addrClient;int len=sizeof(SOCKADDR); while(1) 無限循環(huán) SOCKET sockCo nn=accept(sockSrv,(SOCKADDR*)&addrClie nt,&len); char sen dBuf1OO;spri nt(se ndBuf,"Welcome %s to",inet_n toa(addrClie nt.sin_addr);sen d(sockC onn,sen dBuf,strle n(sen dBuf)+1,0);char recvBuf100;recv(sockC onn, recvBuf);prin

溫馨提示

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

評論

0/150

提交評論