版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
C語言面試題大匯總之華為面試題
silvers|01二月,200715:57
1、局部變量能否和全局變量重名?答:能,局部會屏蔽全局。要用全局變量,需要使
用"::"局部變量可以與全局變量同名,在函數(shù)內(nèi)引用這個變量時,會用到同名的局部變
量,而不會用到全局變量。對于有些編譯器而言,在同一個函數(shù)內(nèi)可以定義多個同名的局部
變量,比如在兩個循環(huán)體內(nèi)都定義一個同名的局部變量,而那個局部變量的作用域就在那個
循環(huán)體內(nèi)。
2、如何引用一個已經(jīng)定義過的全局變量?答:extern可以用引用頭文件的方式,
也可以用extern關(guān)鍵字,如果用引用頭文件方式來引用某個在頭文件中聲明的全局變理,假
定你將那個變寫錯了,那么在編譯期間會報借,如果你用extern方式引用時?,假定你犯了同
樣的錯誤,那么在編譯期間不會報錯,而在連接期間報錯。
3、全局變量可不可以定義在可被多個.C文件包含的頭文件中?為什么?答:可以,
在不同的C文件中以static形式來聲明同名全局變量??梢栽诓煌腃文件中聲明同
名的全局變量,前提是其中只能有一個C文件中時此變量賦初值,此時連接不會出錯
4、語句for(;1;)有什么問題?它是什么意思?答:和while(l)相同。
5、dowhile和whiledo有什么區(qū)別?答:前一個循環(huán)一遍再判斷,后一?"t"判
斷以后再循環(huán)
6、請寫出下列代碼的輸出內(nèi)容
#include
main()
(
inta,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf("b,c,d:%d.%d,%d">b.c,d);
return0;
)
答:10,12,120
7、static全局變量與普通的全局變量有什么區(qū)別?static局部變量和普通局部變量有什么區(qū)
別?static函數(shù)與普通函數(shù)有什么區(qū)別?全局變量(外部變量)的說明之前再冠以static
就構(gòu)成了靜態(tài)的全局變量。全局變量本身就是靜態(tài)存儲方式,靜態(tài)全局變量當(dāng)然也是靜態(tài)
存儲方式。這兩者在存儲方式上并無不同。這兩者的區(qū)別雖在于非靜態(tài)全局變量的作用域
是整個源程序,當(dāng)一個源程序由多個源文件組成時,非靜態(tài)的全局變量在各個源文件中都
是有效的。而靜態(tài)全局變量則限制了其作用域,即只在定義該變量的源文件內(nèi)有效,在
同一源程序的其它源文件中不能使用它。由于靜態(tài)全局變量的作用域局限于一個源文件內(nèi),
只能為該源文件內(nèi)的函數(shù)公用,因此可以避免在其它源文件中引起錯誤。從以上分析
可以看出,把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲方式即改變了它的生存期。把
全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使用范圍。static函數(shù)
與普通函數(shù)作用域不同。僅在本文件。只在當(dāng)前源文件中使用的函數(shù)應(yīng)該說明為內(nèi)部函數(shù)
(static),內(nèi)部函數(shù)應(yīng)該在當(dāng)前源文件中說明和定義。對于可在當(dāng)前源文件以外使用的函數(shù),
應(yīng)該在一個頭文件中說明,要使用這些函數(shù)的源文件要包含這個頭文件static全局變量
與普通的全局變量有什么區(qū)別:static全局變量只初使化一次,防止在其他文件單元中被引
用;static局部變量和普通局部變量有什么區(qū)別:static局部變量只被初始化一次,下一
次依據(jù)上一次結(jié)果值;static函數(shù)與普通函數(shù)有什么區(qū)別:static函數(shù)在內(nèi)存中只有一
份,普通函數(shù)在每個被調(diào)用中維持一份拷貝
8、程序的局部變量存在于(堆棧)中,全局變量存在于(靜態(tài)區(qū))中,動態(tài)申請數(shù)據(jù)存在
于(堆)中。
9、設(shè)有以下說明和定義:
typedefunion
(
longi;intk[5];charc;}DATE;
structdata{intcat;DATEcow;doubledog;}too;
DATEmax;
則語句printf(n%d",sizeof(structdate)+sizeof(max));的執(zhí)行結(jié)果是:___52
答:DATE是一個union,變量公用空間.里面最大的變量類型是int⑸,占用20個字節(jié),所以
它的大小是20data是一個struct,每個變量分開占用空間.依次為int4+DATE20+double8=
32.所以結(jié)果是20+32=52.當(dāng)然…在某些16位編輯器下,int可能是2字節(jié),那么結(jié)果是
int2+DATE10+double8=20
10、隊列和棧有什么區(qū)別?隊列先進(jìn)先出,棧后進(jìn)先出
11>寫出下列代碼的輸出內(nèi)容
#include
intinc(inta){retum(++a);}intmulti(int*a,int*b,int*c)
{retum(*c=*a**b);}typedefint(FUNCl)(intin);typedef
int(FUNC2)(int*,int*,int*);voidshow(FUNC2fun,intargl,int*arg2)
{INCp=&inc;inttemp=p(argl);fun(&temp,&argl,arg2);
printf(',%dn',,*arg2);}main(){inta;show(multi,10,&a);
return0;}答:110
12、請找出下面代碼中的所以錯誤
說明:以下代碼是把一個字符串倒序,如“abed”倒序后變?yōu)椤癲cba”
#includeHstring.hM
main()
(
char*src=nhello,worldn;
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*src二"hello,world";
intlen=strlen(src);
char*dest=(char*)malloc(len+l);〃要為分配一個空間char*d=dest;
char*s=&src[len-l];〃指向最后一個字符
while(len—!=0)
*d++=*s--;
*d=0;〃尾部要加
printf("%sn",dest);
free(dest);〃使用完,應(yīng)當(dāng)釋放空間,以免造成內(nèi)存匯泄露return0;
)
方法2:
#include<stdio.h>
#include<string.h>
main()
(
charstr[]=nhello,world";
intlen=strlen(str);
chart;
for(inti=0;i<len/2;i++)
(
t=str[i];
str[i]=str[len-i-l];str[len-i-l]=t;
)
printf("%sH,str);
return0;
)
13.對于一個頻繁使用的短小函數(shù),在C語言中應(yīng)用什么實現(xiàn),在C++中應(yīng)用什么實現(xiàn)?c
用宏定義,C++用inline
14.直接鏈接兩個信令點的一組鏈路稱作什么?PPP點到點連接
6.接入網(wǎng)用的是什么接口?
V5接口
16.voip都用了那些協(xié)議?H.323協(xié)議簇、SIP協(xié)議、Skype協(xié)議、H.248和MGCP協(xié)議
17.軟件測試都有那些種類?黑盒:針對系統(tǒng)功能的測試白合:測試函數(shù)功能,各
函數(shù)接口
18.確定模塊的功能和模塊的接口是在軟件設(shè)計的那個隊段完成的?概要設(shè)計階段
19.
enumstring
(
xl,
x2,
x3=10,
x4,
x5,
}x;
問x=0x801005,0x8010f4;
20.
unsignedchar*pl;
unsignedlong*p2;
pl=(unsignedchar*)0x801000;
p2=(unsignedlong*)0x810000;
請問pl+5=;
p2+5=;
選擇題:
21.Ethtemet鏈接到Internet用到以下那個協(xié)議?A.HDLC;B.ARP;C.UDP;D.TCP;E.ID
22.屬于網(wǎng)絡(luò)層協(xié)議的是:A.TCP;B.IP;C.ICMP;D.X.2523.Windows消息調(diào)度機
制是:A.指令隊列;B.指令堆棧;C.消息隊列;D.消息堆棧;
24.unsignedshorthash(unsignedshortkey)
{
return(key?)%256
)
請問hash(16),hash(256)的值分別是:
A.1.16;B.8.32;C.4.16;D.1.32
找錯題:
25.請問下面程序有什么錯誤?
inta[60][250][1000],i,j,k;
for(k=0;kMax_GT_Length)
{returnGT_Length_ERROR;
問答題:29.IPPhone的原理是什么?IPV6
30.TCP/IP通信建立的過程怎樣,端口有什么作用?三次握手,確定是哪個應(yīng)用程
序使用該協(xié)議
31.1號信令和7號信令有什么區(qū)別,我國某前廣泛使用的是那一種?
32.列舉5種以上的電話新業(yè)務(wù)
四.找錯題:
1.請問下面程序有什么錯誤?
inta[60J[250J[1000J,i,j,k;
for(k=0;k<=1000;k++)
for(j=0;j<250;j++)
for(i=0;i<60;i++)
a[i]Ul[k]=0;
把循環(huán)語句內(nèi)外換一下
2.#defineMax_CB500
voidLmiQueryCSmd(StructMSgCB*pmsg)
unsignedcharucCmdNum;
for(ucCmdNum=O;ucCmdNum<Max_CB;ucCmdNum++)
死循環(huán)
3.以下是求一個數(shù)的平方的程序,請找出錯誤:
#defineSQUARE(a)((a)*(a))
inta=5;
intb;
b=SQUARE(a++);
4.typedefunsignedcharBYTE
intexamply_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;
五.問答題:
LIPPhone的原理是什么?
IPV6
2.TCP/IP通信建立的過程怎樣,端口有什么作用?
三次握手,確定是哪個應(yīng)用程序使用該協(xié)議
3.1號信令和7號信令有什么區(qū)別,我國某前廣泛使用的是那一種?
4.列舉5種以上的電話新業(yè)務(wù)?
微軟亞洲技術(shù)中心的面試題!!!
1.進(jìn)程和線程的差別。
線程是指進(jìn)程內(nèi)的一個執(zhí)行單元,也是進(jìn)程內(nèi)的可調(diào)度實體.
與進(jìn)程的區(qū)別:
(1)調(diào)度:線程作為調(diào)度和分配的基本單位,進(jìn)程作為擁有資源的基本單位
(2)并發(fā)性:不僅進(jìn)程之間可以并發(fā)執(zhí)行,同一個進(jìn)程的多個線程之間也可并發(fā)
執(zhí)行
(3)擁有資源:進(jìn)程是擁有資源的一個獨立單位,線程不擁有系統(tǒng)資源,但可以
訪問隸屬于進(jìn)程的資源.
(4)系統(tǒng)開銷:在創(chuàng)建或撤消進(jìn)程時,由于系統(tǒng)都要為之分配和回收資源,導(dǎo)致
系統(tǒng)的開銷明顯大于創(chuàng)建或撤消線程時的開銷。
2.測試方法
人工測試:個人復(fù)查、抽查和會審
機器測試:黑盒測試和白盒測試
2.Heap與stack的差別。
Heap是堆,stack是棧。
Stack的空間由操作系統(tǒng)自動分配/釋放,Heap上的空間手動分配/釋放。
Stack空間有限,Heap是很大的自由存儲區(qū)
C中的malloc函數(shù)分配的內(nèi)存空間即在堆上,C++中對應(yīng)的是new操作符。
程序在編譯期對變量和函數(shù)分配內(nèi)存都在棧上進(jìn)行,目程序運行過程中函數(shù)調(diào)用
時參數(shù)的傳遞也在棧上進(jìn)行
3.Windows下的內(nèi)存是如何管理的?
4.介紹.Net和.Net的安全性。
5.客戶端如何訪問.Net組件實現(xiàn)WebService?
6.C/C++編譯器中虛表是如何完成的?
7.談?wù)凜OM的線程模型。然后討論進(jìn)程內(nèi)/外組件的差別。
8.談?wù)処A32下的分頁機制
小頁(4K)兩級分頁模式,大頁(4M)一級
9.給兩個變量,如何找出一個帶環(huán)單鏈表中是什么地方出現(xiàn)環(huán)的?
一個遞增一,一個遞增二,他們指向同一個接點時就是環(huán)出現(xiàn)的地方
10.在IA32中一共有多少種辦法從用戶態(tài)跳到內(nèi)核態(tài)?
通過調(diào)用門,從方叫3至1」日期0,中斷從ring3至UringO,進(jìn)入vm86等等
11.如果只想讓程序有一個實例運行,不能運行兩個。像winamp一樣,只能開
一個窗口,怎樣實現(xiàn)?
用內(nèi)存映射或全局原子(互斥變量)、查找窗口句柄..
FindWindow,互斥,寫標(biāo)志到文件或注冊表,共享內(nèi)存。.
12.如何截取鍵盤的響應(yīng),讓所有的‘a(chǎn)‘變成'b'?
鍵盤鉤子SetWindowsHookEx
13.Apartment在COM中有什么用?為什么要引入?
14.存儲過程是什么?有什么用?有什么優(yōu)點?
我的理解就是一堆sql的集合,可以建立非常復(fù)雜的查詢,編譯運行,所以運行
一次后,以后再運行速度比單獨執(zhí)行SQL快很多
15.Template有什么特點?什么時候用?
16.談?wù)刉indowsDNA結(jié)構(gòu)的特點和優(yōu)點。
17.網(wǎng)絡(luò)編程中設(shè)計并發(fā)服務(wù)器,使用多進(jìn)程與多線程,請問有什么區(qū)別?
1,進(jìn)程:子進(jìn)程是父進(jìn)程的復(fù)制品。子進(jìn)程獲得父進(jìn)程數(shù)據(jù)空間、堆和棧的復(fù)
制品。
2,線程:相對與進(jìn)程而言,線程是一個更加接近與執(zhí)行體的概念,它可以與同
進(jìn)程的其他線程共享數(shù)據(jù),但擁有自己的??臻g,擁有獨立的執(zhí)行序列。
兩者都可以提高程序的并發(fā)度,提高程序運行效率和響應(yīng)時間。
線程和進(jìn)程在使用上各有優(yōu)缺點:線程執(zhí)行開銷小,但不利于資源管理和保護(hù);
而進(jìn)程正相反。同時,線程適合于在SMP機器上運行,而進(jìn)程則可以跨機器遷
移。
思科
1.用宏定義寫出swap(x,y)
#defineswap(x,y)
x=x+y;
y=x-y;
X=x-y;
2.數(shù)組a[N],存放了1至N?1個數(shù),其中某個數(shù)重復(fù)一次。寫一個函數(shù),找出被
重復(fù)的數(shù)字,時間復(fù)雜度必須為。(N)函數(shù)原型:
intdo_dup(inta[]9intN)
3一語而實現(xiàn)x是否為2的若干次第的判斷
inti=512;
cout?boolalpha?((i&(i-1))?false:true)?endl;
4.unsignedintintvert(unsignedintx,intp,intn)實現(xiàn)對x的進(jìn)行轉(zhuǎn)換,p為起始轉(zhuǎn)
化位,n為需要轉(zhuǎn)換的長度,假設(shè)起始點在右邊.如x=0b00010001,p=4,n=3轉(zhuǎn)換后
x=0b01100001
unsignedintintvert(unsignedintx,intp,intn){
unsignedint_t=0;
unsignedint_a=1;
for(inti=0;i<n;++i){
_t1=_a;
_a=_a?1;
)
_t=__t?p;
xA=_t;
returnx;
)
慧通:
1.什么是預(yù)編譯,何時需要預(yù)編譯:
1、總是使用不經(jīng)常改動的大型代碼體。
2、程序由多個模塊組成,所有模塊都使用一組標(biāo)準(zhǔn)的包含文件和相同的編譯選
項。在這種情況下,可以將所有包含文件預(yù)編譯為一個預(yù)編譯頭。
2.上述三個有什么區(qū)別?
char*constp;
charconst*p
constchar*p
解答:
char*constp;〃常量指針,p的值不可以修改
charconst*p;〃指向常量的指針,指向的常量值不可以改
constchar*p;〃和charconst*p
3.解釋下列輸出結(jié)果
charstrl[]="abc";
charstr2[]="abc";
constcharstr3[]="abc";
constcharstr4[]="abc”;
constchar*str5=HabcM;
constchar*str6="abc";
char*str7="abc”;
char*str8="abc”;
cout?(strl==str2)?endl;
cout?(str3==str4)?endl;
cout?(str5==str6)?endl;
cout?(str7==str8)?endl;
結(jié)果是:0011
解答:strl,str2,str3,str4是數(shù)組變量,它們有各自的內(nèi)存空間;
而str5,str6,str7,str8是指針,它們指向相同的常量區(qū)域。
4.以下代碼中的兩個sizeof用法有問題嗎?[C易]
voidUpperCase(charstr[])〃將str中的小寫字母轉(zhuǎn)換成大寫字母
(
for(size_ti=0;i<sizeof(str)/sizeof(str[0]);++i)
if(,a,<=str[i]&&str[i]<=,z,)
str[i]-=);
)
charstr[J=naBcDeH;
cout?"str字符長度為:"?sizeof(str)/sizeof(str[OJ)?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ù)組相關(guān)的信息,因此sizeof作用于上只將其當(dāng)指針看,一個指針為4
個字節(jié),因此返回4。
4.一個32位的機器,該機器的指針是多少位
指針是多少位只要看地址總線的位數(shù)就行了。80386以后的機子都是32的數(shù)據(jù)總
線。所以指針的位數(shù)就是4個字節(jié)了。
5.指出下面代碼的輸出,并解釋為什么。
main()
(
inta[5]={1,2,3,4,5};
int*ptr=(int*)(&a+l);
printf(H%d,%dn,*(a+l),*(ptr-l));
)
輸出:2,5
*(a+l)就是a[l],*(ptr-l)就是a[4],執(zhí)行結(jié)果是2,5
&a+l不是首地址+1,系統(tǒng)會認(rèn)為加一個a數(shù)組的偏移,是偏移了一個數(shù)組的大
小(本例是5個int)
int*ptr=(int*)(&a+l);
則ptr實際是&(a[5]),也就是a+5
原因如下:
&a是數(shù)組指針,其類型為int(*)[5];
而指針加1要根據(jù)指針類型加上一定的值,
不同類型的指針+1之后增加的大小不同
a是長度為5的int數(shù)組指針,所以要加5*sizeof(int)
所以ptr實際是a[5]
但是prt與(&a+l)類型是不一樣的(這點很重要)
所以prt-1只會減去sizeof(int*)
a,&a的地址是一樣的,但意思不一樣,a是數(shù)組首地址,也就是a[0]的地址,&a
是對象(數(shù)組)首地址,a+1是數(shù)組下一元素的地址,即a[l],&a+l是下一個對象
的地址,即a⑸.
6.請問以下代碼有什么問題:
1).
intmain()
(
chara;
char*str=&a;
strcpy(str,"hello");
printf(str);
return0;
)
沒有為str分配內(nèi)存空間,將會發(fā)生異常
問題出在將一個字符串復(fù)制進(jìn)一個字符變量指針?biāo)傅刂贰km然可以正確輸出結(jié)
果,但因為越界進(jìn)行內(nèi)在讀寫而導(dǎo)致程序崩潰。
2).
char*s="AAA";
printf("%s",s);
s[OJ='B';
printf("%s",s);
有什么錯?
"AAA"是字符串常量。s是指針,指向這個字符串常量,所以聲明s的時候就有
問題。
cosntchar*s="AAA”;
然后又因為是常量,所以對是s[0]的賦值操作是不合法的。
1、寫一個“標(biāo)準(zhǔn)”宏,這個宏輸入兩個參數(shù)并返回較小的一個。
"defineMin(X,Y)((X)>(Y)?(Y):(X))〃結(jié)尾沒有;
2、嵌入式系統(tǒng)中經(jīng)常要用到無限循環(huán),你怎么用C編寫死循環(huán)。
while⑴[}或者for(;;)
3、關(guān)鍵字static的作用是什么?
定義靜態(tài)變量
4、關(guān)鍵字const有什么含意?
表示常量不可以修改的變量。
5、關(guān)鍵字volatile有什么含意?并舉出三個不同的例子?
提示編譯器對象的值可能在編譯器耒監(jiān)測到的情況下改變。
6.int(*s[10])(int)表示的是什么啊
int(*s[10])(int)函數(shù)指針數(shù)組,每個指針指向一個intfunc(intparam)的函數(shù)。
1.有以下表達(dá)式:
inta=248;b=4;intconstc=21;constint*d=&a;
int*conste=&b;intconst*fconst=&a;
請問下列表達(dá)式哪些會被編譯器禁止?為什么?
*c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;
*c這是個什么東東,禁止
*d說了是const,禁止
e=&a說了是const禁止
const*fconst=&a;禁止
2.交換兩個變量的值,不使用第三個變量。即a=3,b=5,交換之后a=5,b=3;
有兩種解法,一種用算術(shù)算法,一種用人(異或)
a=a+b;
b=a-b;
a=a-b;
or
a=a”;〃只能對int,char..
b=aAb;
a=aAb;
or
aA=bA=a;
3.c和C++中的struct有什么不同?
c和C++中struct的主要區(qū)別是c中的struct不可以含有成員函數(shù),而C++中的struct
可以。C++中struct和class的主要區(qū)別在于默認(rèn)的存取權(quán)限不同,struct默認(rèn)為
public,而class默認(rèn)為private
4.#inciude<stdio.h>
#include<stdlib.h>
voidgetmemory(char*p)
{
p=(char*)malloc(lOO);
strcpy(p,Hhelloworld");
)
intmain()
(
char*str=NULL;
getmemory(str);
printf(”%s/n”,str);
free(str);
return0;
)
程序崩潰,getmemory中的malloc不能返回動態(tài)內(nèi)存,free()對str操作很危險
5.charszstr[10];
strcpy(szstr,nO123456789*');
產(chǎn)生什么結(jié)果?為什么?
長度不一樣,會造成非法的OS
6.列舉幾種進(jìn)程的同步機制,并比較其優(yōu)缺點。
原子操作
信號量機制
自旋鎖
管程,會合,分布式系統(tǒng)
7.進(jìn)程之間通信的途徑
共享存儲系統(tǒng)
消息傳遞系統(tǒng)
管道:以文件系統(tǒng)為基礎(chǔ)
8.
一般分類::評論(41)::靜態(tài)鏈接網(wǎng)址::引用(0)
面試經(jīng)典試題
silvers|02一月,200711:41
面試經(jīng)典試題
Author:Vince
即使你是個編程高手,你在面試前也應(yīng)該要看看這套題,
她也許會給你帶來好運,否則你有可能后悔當(dāng)初為什么沒有看而跳樓
自殺,這樣我會很內(nèi)疚的。這套題看似簡單,但你未必能得高分,即
使你看不懂也要把她背下來!
歡迎轉(zhuǎn)載此文,轉(zhuǎn)載時請注明文章來源:文斯測試技術(shù)研究中心
http://blog.csdn?net/vincetest
1編程基礎(chǔ)
1.1基本概念
1.const的理解:constchar*,charconst*,char*const的區(qū)別問題幾乎是C++面試中每
次都會有的題目。事實上這個概念誰都有只是三種聲明方式非常相似很容易記
混。Bjarne在他的TheC++ProgrammingLanguage里面給出過一個助記的方法:
把一個聲明從右向左讀。
char*constcp;(*讀成pointerto)
cpisaconstpointertochar
constchar*p;
pisapointertoconstchar;
charconst*p;
同上因為C++里面沒有const*的運算符,所以const只能屬于前面的類型
2.c指針
int*p[n];——指針數(shù)組,每個元素均為指向整型數(shù)據(jù)的指針。
int(*)p[n]:p為指向一維數(shù)組的指針,這個一?維數(shù)組有n個整型數(shù)據(jù)。
int*p();函數(shù)帶回指針,指針指向返回的值。
int(*)p();p為指向函數(shù)的指針。
3.數(shù)組越界問題
下面這個程序執(zhí)行后會有什么錯誤或者效果:
#defineMAX255
intmain()
(
unsignedcharA[MAX],i;
for(i=0;i<=MAX;i++)
A[i]=i;
)
解答:MAX=255,數(shù)組A的下標(biāo)范圍為O.MAX-l,這是其一淇二當(dāng)i循環(huán)到255
時,循環(huán)內(nèi)執(zhí)行:A[255]=255;這句本身沒有問題,但是返回for(i=0;i<=MAX:i++)
語句時,由于unsignedchar的取值范圍在(O..255),i++以后i又為0了..無限循環(huán)下
去.
注:char類型為一個字節(jié),取值范圍是[-128,127],unsignedchar[0,255]
4.C++:memset,memcpy和strcpy的根本區(qū)別?
#include"memory.h"
memset用來對一段內(nèi)存空間全部設(shè)置為某個字符,一般用在對定義的字符串進(jìn)
行初始化為或";例:chara(100];memset(a,",sizeof(a));
memcpy用來做內(nèi)存拷貝,你可以拿它拷貝任何數(shù)據(jù)類型的對象,可以指定拷貝
的數(shù)據(jù)長度;例:chara[100],b[50];memcpy(b,a,sizeof(b));注意如用sizeof(a),
會造成b的內(nèi)存地址溢出。
strcpy就只能拷貝字符串了,它遇到"就結(jié)束拷貝;例:chara[100],b[50];strcpy(a,b);
如用strcpy(b,a),要注意a中的字符串長度(第一個“之前)是否超過50位,如超
過,則會造成b的內(nèi)存地址溢出。
strcpy
原型:externchar*strcpy(char*dest,char*src);
用法:#include
功能:把src所指由NULL結(jié)束的字符串復(fù)制到dest所指的數(shù)組中。
說明:src和dest所指內(nèi)存區(qū)域不可以重疊且dest必須有足夠的空間來容納src
的字符串。
返回指向dest的指針。
memcpy
原型:externvoid*memcpy(void*dest,void*src,unsignedintcount);
用法:#include
功能:由src所指內(nèi)存區(qū)域復(fù)制count個字節(jié)到dest所指內(nèi)存區(qū)域。
說明:src和dest所指內(nèi)存區(qū)域不能重疊,函數(shù)返回指向dest的指針。
Memset
原型:externvoid*memset(void*buffer,charc,intcount);
用法:#include
功能:把buffer所指內(nèi)存區(qū)域的前count個字節(jié)設(shè)置成字符c。
說明:返回指向buffer的指針。
5.ASSERT。是干什么用的
ASSERT。是一個調(diào)試程序時經(jīng)常使用的宏,在程序運行時它計算括號內(nèi)的表達(dá)
式,如果表達(dá)式為FALSE(0),程序?qū)蟾驽e誤,并終止執(zhí)行。如果表達(dá)式不為0,
則繼續(xù)執(zhí)行后面的語句。這個宏通常原來判斷程序中是否出現(xiàn)了明顯非法的數(shù)
據(jù),如果出現(xiàn)了終止程序以免導(dǎo)致嚴(yán)重后果,同時也便于查找錯誤。例如,變量
n在程序中不應(yīng)該為0,如果為0可能導(dǎo)致錯誤,你可以這樣寫程序:
ASSERT(n!=0);
k=10/n;
ASSERT只有在Debug版本中才有效,如果編譯為Release版本則被忽略。
assert。的功能類似,它是ANSIC標(biāo)準(zhǔn)中規(guī)定的函數(shù),它與ASSERT的一個重要
區(qū)別是可以用在Release版本中。
6.system("pause");系統(tǒng)的暫停程序,按任意鍵繼續(xù),屏幕會打印,"按任意鍵繼
續(xù)。。。?!笆∪チ耸褂胓etchar();
7.請問C++的類和C里面的struct有什么區(qū)別?
C++中的類具有成員保護(hù)功能,并且具有繼承,多態(tài)這類。。蹣,而c里的struct
沒有
8.請講一講析構(gòu)函數(shù)和虛函數(shù)的用法和作用?
析構(gòu)函數(shù)也是特殊的類成員函數(shù),它沒有返回類型,沒有參數(shù),不能隨意調(diào)用,
也沒有重載。知識在類對象生命期結(jié)束的時候,由系統(tǒng)自動調(diào)用釋放在構(gòu)造函數(shù)
中分配的資源。這種在運行時,能依據(jù)其類型確認(rèn)調(diào)用那個函數(shù)的能力稱為多態(tài)
性,或稱遲后聯(lián)編。另:析構(gòu)函數(shù)一般在對象撤消前做收尾工作,比如回收內(nèi)存
等工作,虛擬函數(shù)的功能是使子類可以用同名的函數(shù)對父類函數(shù)進(jìn)行重載,并且
在調(diào)用時自動調(diào)用子類重載函數(shù),如果是純虛函數(shù),則純粹是為了在子類重載時
有個統(tǒng)--的命名而已。
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位。
1.2程序設(shè)計
1.編寫用C語言實現(xiàn)的求n階階乘問題的遞歸算法:
longintfact(intn)
{
intx;
longinty;
if(n<0)
(
printf("error!〃);
)
if(n=0)
return1;
x=n-l;
y=fact(x);
return(n*y);
}
2.二分查找算法:
1)遞歸方法實現(xiàn):
intBSearch(elemtypea[],elemtypex,intlow,inthigh)
/*在下屆為low,上界為high的數(shù)組a中折半查找數(shù)據(jù)元素x*/
(
intmid;
if(low>high)return-1;
mid=(low+high)/2;
if(x==a[mid])returnmid;
if(x<a[mid])return(BSearch(a,x,low,mid-1));
elsereturn(BSearch(a,x,mid+1,high));
)
2)非遞歸方法實現(xiàn):
intBSearch(elemtypea[],keytypekey,intn)
(
intlow,high,mid;
low=0;high=n-l;
while(low<=high)
(
mid=(low+high)/2;
if(a[mid].key=key)returnmid;
elseif(a[mid].key<key)low=mid+1;
elsehigh=midT;
)
return-1;
)
3.遞歸計算如下遞歸函數(shù)的值(斐波拉契):
f⑴=1
f⑵=1
f(n)=f(n-l)+f(n-2)n>2
解:
intf(intn)
(
inti,s,si,s2;
sl=l;/*sl用于保存f(n-1)的值*/
s2=l;/*s2用于保存f(n-2)的值*/
s=l;
for(i=3;i<=n;i++)
(
s=sl+s2;
s2=sl;
sl=s;
}
return(s);
4.交換兩個數(shù),不用第三塊兒內(nèi)存:
inta=…
intb=???
a=a+b;
b=a-b;
a=a-b;
5.冒泡排序:
voidBubbleSort(elemtypex[],intn)
inti,j;
elemtypetemp;
for(i=l;i<n;i++)
for(j=0;j<n-i;j++)
(
if(x[j].key>x[j+l].key)
(
temp=x[j];
x[j]=x[j+l];
x[j+l]=temp;
)
)
)
6.c語言文件讀寫
^include"stdio.h〃
mainO
FILE*fp;
charch,filename[10];
scanf("%s〃,filename);
if((fp=fopen(filename,〃w")=NULL)
{
printf(,,cann,topenfilen〃);
exit(0);
)
ch=getchar();
while(ch!=,#')
(
fputc(ch,fp);
putchar(ch);
ch=getchar();
)
fclose(fp);
)
7.winsocket編程
#include<Winsock2.h>
^include<stdio.h>
voidmain()
(
WORDwVersionRequested;
WSADATAwsaData;
interr;
wVersionRequested=MAKEWORD(1,1);
err二WSAStartup(wVersionRequested,fewsaData);
if(err!=0)
(
return;
)
if(L0BYTE(wsaData.wVersion)!=11|
HIBYTE(wsaData.wVersion)!=1)
(
WSACleanupO;
return;
)
SOCKETsockSrv=socket(AF」NET,SOCK_STREAM,0);
SOCKADDR_INaddrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5);
SOCKADDR_INaddrClient;
intlen=sizeof(SOCKADDR);
while(l)
SOCKETsockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
charsendBuf[100];
sprint(sendBuf,,zWelcome%stohttp:〃www.sunxin.
inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
charrecvBuf[100];
recv(sockConn,recvBuf);
printf(〃%sn〃,recvBuf);
closesocket(sockConn);
WSACleanupO;
)
)
注:這是Server端;File->New->Win32ConsoleApplication,工程名:TcpSrv;
然后,F(xiàn)ile->New->C++SourceFile,文件名:TcpSrv;在該工程的Setting的Link
的Object/librarymodules項要加入ws2_32.1ib
ttinclude<Winsock2.h>
^include<stdio.h>
voidmainO
(
WORDwVersionRequested;
WSADATAwsaData;
interr;
wVersionRequested=MAKEWORD(1,1);
err=WSAStartup(wVersionRequested,&wsaData);
if(err!=0)
(
return;
)
if(LOBYTE(wsaData.wVersion)!=1||
HIBYTE(wsaData.wVersion)!=1)
(
WSACleanupO;
return;
)
SOCKETsockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_INaddrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addrC'〃);
addrSrv.sin_family=AF_INET;
addrSrv.sin_porthtons(6000);
connect(sockClient,(S0CKADDR*)&addrSrv,sizeof(SOCKADDR));
charrecvBuf[100];
recv(sockClient,recvBuf,100,0);
printf(〃%sn〃,recvBuf);
send(sockClient,z,Thisiszhangsan”,strlen("Thisiszhangsan")+1,0);
closesocket(sockClient);
WSACleanupO;
)
注:這是Client端;File->New->Win32ConsoleApplication,工程名:TcpClient;然后,
File->New->C++SourceFile,文件名:TcpClient;同理,在該工程的Setting的Link
的Object/librarymodules項要加入ws2_32.lib
8.類的知識
C++
ttinclude<iostream.h>
classhuman
(
public:
human(){humannum++;);
staticinthuman_num;
"human()
{
human_num一;
print();
)
voidprint()
(
cout<<,zhumannumis:,z<<human_num<<endl;
}
protected:
private:
);
inthuman::humannum=0;
humanfl(humanx)
(
x.print();
returnx;
)
intmain(intargc,char*argv[])
(
humanhl;
hl.print();
humanh2=fl(hl);
h2.print();
return0;
)
輸出:
1
1
0
0
-1
-2
分析:
humanhl;〃調(diào)用構(gòu)造函數(shù),hum_num=1;
hl.print。;〃輸出:"humanis1"
humanh2=fl(hl);〃再調(diào)用fl(hl)的過程中,由于函數(shù)參數(shù)是按值傳遞對象,調(diào)用
默認(rèn)的復(fù)制構(gòu)造函數(shù),?股分類::評論(9)::靜態(tài)鏈接網(wǎng)址::引用(0)
C/C++程序設(shè)計員應(yīng)聘常見面試試題深入剖析
silvers|25九月,200609:07
本文的寫作目的并不在于提供C/C++程序員求職面試指導(dǎo),而旨在從技術(shù)上分析面試題的內(nèi)
涵。文中的大多數(shù)面試題來自各大論壇,部分試題解答也參考了網(wǎng)友的意見。
許多面試題看似簡單,卻需要深厚的基本功才能給出完美的解答。企業(yè)要求面試者寫一
個最簡單的strcpy函數(shù)都可看出面試者在技術(shù)上究竟達(dá)到了怎樣的程度,我們能真正寫好一
個strcpy函數(shù)嗎?我們都覺得自己能,可是我們寫出的strcpy很可能只能拿到10分中的2分。
讀者可從本文看到strcpy函數(shù)從2分到10分解答的例子,看看自己屬于什么樣的層次。止匕外,
還有一些面試題考查面試者敏捷的思維能力。
分析這些面試題,本身包含很強的趣味性:而作為?名研發(fā)人員,通過對這些面試題的
深入剖析則可進(jìn)一步增強自身的內(nèi)功。
2.找錯題
試題1:
voidtest1()
charstringllOJ;
char*strl="0123456789";
strcpy(string,strl);
試題2:
voidtest2()
charstringl10|,strl110|;
inti;
for(i=0;i<10;i++)
(
strl[i]='a';
}
strcpy(string,strl);
)
試題3:
voidtest3(char*strl)
(
charstring[10|;
if(strlen(strl)<=10)
(
strcpy(string,strl);
}
)
解答:
試題1字符串strl需要11個字節(jié)才能存放下(包括末尾的‘‘),而string只有10個字節(jié)
的空間,strcpy會導(dǎo)致數(shù)組越界;
對試題2,如果面試者指出字符數(shù)組strl不能在數(shù)組內(nèi)結(jié)束可以給3分;如果面試者指
出strcpy(string,strl)調(diào)用使得從strl內(nèi)存起復(fù)制到string內(nèi)存起所復(fù)制的字節(jié)數(shù)具有不確定
性可以給7分,在此基礎(chǔ)上指出庫函數(shù)strcpy工作方式的給10分;
對試題3,if(strlen(strl)<=10)應(yīng)改為if(strlen(strl)<10),因為strlen的結(jié)果未統(tǒng)計”所
占用的1個字節(jié)。
剖析:
考查對基本功的掌握:
(1)字符串以"結(jié)尾;
(2)對數(shù)組越界把握的敏感度;
(3)庫函數(shù)strcpy的工作方式,如果編寫一個標(biāo)準(zhǔn)strcpy函數(shù)的總分值為10,下面給出
幾個不同得分的答案:
2分
voidstrcpy(char*strDest,char*strSrc)
(
while((*strDest++=*strSrc-H-)!=’‘);
)
4分
voidstrcpy(char*strDest,constchar*strSrc)
〃將源字符串加const,表明其為輸入?yún)?shù),力口2分
(
while((*strDest++=*strSrc++)!=°);
)
7分
voidstrcpy(char*strDest,constchar*strSrc)
(
〃對源地址和目的地址加非0斷言,加3分
assert((strDest!=NULL)&&(strSrc!=NULL));
while((*strDest++=*strSrc++)!=");
)
10分
〃為了實現(xiàn)鏈?zhǔn)讲僮?,將目的地址返回,力?分!
char*strcpy(char*strDest,constchar*strSrc)
(
assert((strDest!=NULL)&&(strSrc!=NULL));
char*address=strDest;
while((*strDest++=*strSrc++)!=°);
returnaddress;
從2分到10分的幾個答案我們可以清楚的看到,小小的strcpy竟然暗臧著這么多玄機,
真不是蓋的!需要多么扎實的基本功才能寫一個完美的strcpy啊!
(4)對strlen的掌握,它沒有包括字符串末尾的”。
讀者看了不同分值的strcpy版本,應(yīng)該也可以寫出一個10分的strlen函數(shù)了,完美的
版本為:intstrlen(constchar*str)〃輸入?yún)?shù)const
(
assert(strt!=NULL);〃斷言字符串地址非0
intlen;
while((*str++)!=*')
(
len++;
)
returnlen;
試題4:
voidGetMemory(char*p)
(
p=(char*)malloc(100);
)
voidTest(void)
(
char*str=NULL;
GetMemory(str);
strcpy(str,"helloworld'1);
printf(str);
)
試題5:
char*GetMemory(void)
(
charp[]="helloworld";
returnp;
)
voidTest(void)
char*str=NULL;
str=GetMemoryO;
printf(str);
試題6:
voidGetMemory(char**p,intnum)
(
*p=(char*)malloc(num);
)
voidTest(void)
(
char*str=NULL;
GetMemory(&str,100);
strcpy(str,"hello”);
printf(str);
)
試題7:
voidTest(void)
(
char*str=(char*)malloc(100);
strcpy(str,"hello");
free(str);
…〃省略的其它語句
)
解答:
試題4傳入中GetMemory(char*p)函數(shù)的形參為字符串指針,在函數(shù)內(nèi)部修改形參并
不能真正的改變傳入形參的值,執(zhí)行完
char*str=NULL;
GetMemory(str);
后的str仍然為NULL;
試題5中
charp[]="helloworld";
returnp;
的p[]數(shù)組為函數(shù)內(nèi)的局部自動變量,在函數(shù)返回后,內(nèi)存已經(jīng)被釋放。這是許多程序
員常犯的錯誤,其根源在于不理解變量的生存期。
試題6的GetMemory避免了試題4的問題,傳入GetMemory的參數(shù)為字符串指針的指
針,但是在GetMemory中執(zhí)行申請內(nèi)存及賦值語句
*p=(char*)malloc(num);
后未判斷內(nèi)存是否申請成功,應(yīng)加上:
if(*p=NULL)
(
…〃進(jìn)行申請內(nèi)存失敗處理
)
試題7存在與試題6同樣的問題,在執(zhí)行
char*str=(char*)malloc(100);
后未進(jìn)行內(nèi)存是否申請成功的判斷;另外,在free(str)后未置str為空,導(dǎo)致可能變成一
個“野”指針,應(yīng)加上:
str=NULL;
試題6的Test函數(shù)中也未對malloc的內(nèi)存進(jìn)行釋放。
剖析:
試題4?7考查面試者對內(nèi)存操作的理解程度,基本功扎實的面試者一般都能正確的回
答其中50~60的錯誤。但是要完全解答正確,卻也絕非易事。
對內(nèi)存操作的考查主要集中在:
(1)指針的理解;
(2)變量的生存期及作用范圍;
(3)良好的動態(tài)內(nèi)存申請和釋放習(xí)慣。
再看看下面的一段程序有什么錯誤:
swap(int*pl,int*p2)
(
int*p;
*p=*pl;
*pl=*p2;
*p2=*p;
)
在swap函數(shù)中,p是一個“野”指針,有可能指向系統(tǒng)區(qū),導(dǎo)致程序運行的崩潰。在VC++
中DEBUG運行時提示錯誤"AccessViolation"。該程序應(yīng)該改為:
swap(int*pl,int*p2)
(
intp;
p=*pl;
*pl=*p2;
*p2=p;
)
3.內(nèi)功題
試題1:分別給出BOOL,int,float,指針變量與“零值”比較的if語句(假設(shè)變量名
為var)
解答:
BOOL型變量:if(!var)
int型變量:if(var==0)
float型變量:
constfloatEPSINON=0.00001;
if((x>=-EPSINON)&&(x<=EPSINON)
指針變量:if(var==NULL)
剖析:
考查對0值判斷的“內(nèi)功”,BOOL型變量的0判斷完全可以寫成if(va—O),而int型變
量也可以寫成if(!var),指針變量的判斷也可以寫成if(!var),上述寫法雖然程序都能正確運
行,但是未能清晰地表達(dá)程序的意思。
一般的,如果想讓if判斷一個變量的“真"、"假",應(yīng)直接使用if(var)、if(!var),表明其
為“邏輯”判斷;如果用if判斷一個數(shù)值型變量(short、int、long等),應(yīng)該用if(var==0),表
明是與0進(jìn)行“數(shù)值”上的比較;而判斷指針則適宜用if(var==NULL),這是一種很好的編程
習(xí)慣。
浮點型變量并不精確,所以不可將float變量用“=="或"!=”與數(shù)字比較,應(yīng)該設(shè)法轉(zhuǎn)化
成“>=”或“v=”形式。如果寫成if(x==0.0),則判為錯,得0分。
試題2:以下為WindowsNT下的32位C++程序,請計算sizeof的值
voidFunc(charstr[100])
(
sizeof(str)=?
)
void*p=malloc(100);
sizeof(p)=?
解答:
sizeof(str)=4
sizeof(p)=4
剖析:
Func(charstr[100])函數(shù)中數(shù)組名作為函數(shù)形參時,在函數(shù)體內(nèi),數(shù)組名失去了本身的
內(nèi)涵,僅僅只是一個指
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 測量實習(xí)技術(shù)工作總結(jié)報告5篇
- 急診科臨床診療指南-技術(shù)操作規(guī)范更新版
- 班級讀書活動總結(jié)2023字(5篇)
- 商混供銷合同
- 上海房產(chǎn)買賣合同模版
- 有關(guān)3分鐘開業(yè)慶典嘉賓致辭稿7篇
- 建筑銷售BT施工合同
- 大學(xué)生個人自薦信模板5篇
- 教師節(jié)演講稿開頭(3篇)
- 農(nóng)村商業(yè)街區(qū)改造
- 風(fēng)電場道路及風(fēng)機基礎(chǔ)工程冬季施工方案
- 財務(wù)管理委托代理會計服務(wù) 投標(biāo)文件(技術(shù)方案)
- 2024年全國高考Ⅰ卷英語試題及答案
- 期刊編輯的學(xué)術(shù)期刊編輯規(guī)范考核試卷
- T-CCSAS014-2022《化工企業(yè)承包商安全管理指南》
- 電梯安全總監(jiān)和安全員的任命文件
- SL-T+62-2020水工建筑物水泥灌漿施工技術(shù)規(guī)范
- 2024年安徽省普通高中學(xué)業(yè)水平選擇性考試 歷史試卷
- 電子商務(wù)師職業(yè)技能等級證書培訓(xùn)方案
- JBT 14615-2024 內(nèi)燃機 活塞運動組件 清潔度限值及測定方法(正式版)
- DL5009.2-2013電力建設(shè)安全工作規(guī)程第2部分:電力線路
評論
0/150
提交評論