C语言 ,嵌入式 ,数据结构 面试题目(2)
生活随笔
收集整理的這篇文章主要介紹了
C语言 ,嵌入式 ,数据结构 面试题目(2)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
100
struct name1{
? char str;? short x;
? int ?num;
}
struct name2{
? char str;
? int num;
? short x;
}
sizeof(struct name1)=8,sizeof(struct name2)=12
101讀文件file1.txt的內(nèi)容(例如):
12
34
56
輸出到file2.txt:
56
34
12
(逆序)
2)輸出和為一個(gè)給定整數(shù)的所有組合
例如n=5
5=1+4;5=2+3(相加的數(shù)不能重復(fù))
則輸出
1,4;2,3。
注意可增長(zhǎng)數(shù)組的應(yīng)用.
#i nclude <stdio.h>
#i nclude <stdlib.h>
int main(void)
{
? ? ? ? int MAX = 10;
int *a = (int *)malloc(MAX * sizeof(int));
int *b;
? ?
FILE *fp1;
FILE *fp2;
fp1 = fopen("a.txt","r");
if(fp1 == NULL)
{printf("error1");
? ?exit(-1);
}
? ? fp2 = fopen("b.txt","w");
if(fp2 == NULL)
{printf("error2");
? ?exit(-1);
}
int i = 0;
? ?int j = 0;
while(fscanf(fp1,"%d",&a[i]) != EOF)
{
i++;
j++;
if(i >= MAX)
{
MAX = 2 * MAX;
b = (int*)realloc(a,MAX * sizeof(int));
if(b == NULL)
{
printf("error3");
exit(-1);
}
a = b;
}
}
for(;--j >= 0;)
? fprintf(fp2,"%d\n",a[j]);
fclose(fp1);
fclose(fp2);
return 0;
}
102 一個(gè)遞規(guī)反向輸出字符串的例子,經(jīng)典例程.
void inverse(char *p)
{
? ?if( *p = = '\0' )?
return;
? ?inverse( p+1 );
? ?printf( "%c", *p );
}
int main(int argc, char *argv[])
{
? ?inverse("abc\0");
? ? return 0;
}
103、用遞歸算法判斷數(shù)組a[N]是否為一個(gè)遞增數(shù)組。
遞歸的方法,記錄當(dāng)前最大的,并且判斷當(dāng)前的是否比這個(gè)還大,大則繼續(xù),否則返回false結(jié)束:
bool fun( int a[], int n )
{
if( n= =1 )
return true;
if( n= =2 )
return a[n-1] >= a[n-2];
return fun( a,n-1) && ( a[n-1] >= a[n-2] );
}
104 什么是可重入性?
可重入(reentrant)函數(shù)可以由多于一個(gè)任務(wù)并發(fā)使用,而不必?fù)?dān)心數(shù)據(jù)錯(cuò)誤。相反,不可重入(non-reentrant)函數(shù)不能由超過(guò)一個(gè)任務(wù)所共享,除非能確保函數(shù)的互斥(或者使用信號(hào)量,或者在代碼的關(guān)鍵部分禁用中斷)。可重入函數(shù)可以在任意時(shí)刻被中斷,稍后再繼續(xù)運(yùn)行,不會(huì)丟失數(shù)據(jù)。可重入函數(shù)要么使用本地變量,要么在使用全局變量時(shí)保護(hù)自己的數(shù)據(jù)。
105 可重入函數(shù):
不為連續(xù)的調(diào)用持有靜態(tài)數(shù)據(jù)。
不返回指向靜態(tài)數(shù)據(jù)的指針;所有數(shù)據(jù)都由函數(shù)的調(diào)用者提供。
使用本地?cái)?shù)據(jù),或者通過(guò)制作全局?jǐn)?shù)據(jù)的本地拷貝來(lái)保護(hù)全局?jǐn)?shù)據(jù)。
如果必須訪問(wèn)全局變量,記住利用互斥信號(hào)量來(lái)保護(hù)全局變量。
絕不調(diào)用任何不可重入函數(shù)。;
106.用最簡(jiǎn)單的方法實(shí)現(xiàn)函數(shù)int strcmp(char *p1,char *p2)
int ret;
//while( *p1 && *p2 && !(ret=*p1-*p2) )
while(!(ret=*p1-*p2) && *p1 && *p2)
{
p1++;p2++;
}
return ret;
int strcmp(const char * cs,const char * ct)
{
register signed char __res;
while (1) {
if ((__res = *cs - *ct++) != 0 || !*cs++)
break;
}
return __res;
}
107什么是預(yù)編譯,何時(shí)需要預(yù)編譯:?
答案:?
1、總是使用不經(jīng)常改動(dòng)的大型代碼體。?
2、程序由多個(gè)模塊組成,所有模塊都使用一組標(biāo)準(zhǔn)的包含文件和相同的編譯選項(xiàng)。在這種情況下,可以將所有包含文件預(yù)編譯為一個(gè)預(yù)編譯頭。?
108 char * const p ? ? ?char const * p ? ? ?const char *p 上述三個(gè)有什么區(qū)別??
答案:?
char * const p; //常量指針,p的值不可以修改?
char const * p;//指向常量的指針,指向的常量值不可以改 const char *p; //和char const *p?
109 char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "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;?
結(jié)果是:0 0 1 1 str1,str2,str3,str4是數(shù)組變量,它們有各自的內(nèi)存空間;而str5,str6,str7,str8是指針,它們指向相同的常量區(qū)域。?
110以下代碼中的兩個(gè)sizeof用法有問(wèn)題嗎??
void UpperCase( char str[] ) // 將 str 中的小寫字母轉(zhuǎn)換成大寫字母?
{ ? ?
for( size_t i=0; i <sizeof(str)/sizeof(str[0]); ++i ) ? ? ? ?
if( 'a' <=str[i] && str[i] <='z' ) ? ? ? ? ? ?
str[i] -= ('a'-'A' );
}?
char str[] = "aBcDe";
cout < < "str字符長(zhǎng)度為: " < < sizeof(str)/sizeof(str[0]) < < endl;?
UpperCase( str );
cout < < str < < endl;?
答案:函數(shù)外的str是一個(gè)靜態(tài)定義的數(shù)組,因此其大小為6,因?yàn)檫€有'\0',
函數(shù)內(nèi)的str返回4。?
111一個(gè)32位的機(jī)器,該機(jī)器的指針是多少位答案:?
指針是多少位只要看地址總線的位數(shù)就行了。80386以后的機(jī)子都是32的數(shù)據(jù)總線。所以指針的位數(shù)就是4個(gè)字節(jié)了。?
112。
main()?
{ ?
int a[5]={1,2,3,4,5}; ? ?
int *ptr=(int *)(&a+1); ? ?
printf("%d,%d",*(a+1),*(ptr-1));?
} 答案:2。5?
113。請(qǐng)問(wèn)以下代碼有什么問(wèn)題:
int ?main()
{
?char a;
?char *str=&a;
?strcpy(str,"hello");
?printf(str);?
return 0;?
} 答案:沒(méi)有為str分配內(nèi)存空間,將會(huì)發(fā)生異常問(wèn)題出在將一個(gè)字符串復(fù)制進(jìn)一個(gè)字符變量指針?biāo)傅刂?。雖然可以正確輸出結(jié)果,但因?yàn)樵浇邕M(jìn)行內(nèi)在讀寫而導(dǎo)致程序崩潰。?
114。
char* s="AAA";
printf("%s",s);?
s[0]='B';?
printf("%s",s);?
有什么錯(cuò)?
答案:"AAA"是字符串常量。s是指針,指向這個(gè)字符串常量,所以聲明s的時(shí)候就有問(wèn)題。 cosnt char* s="AAA"; 然后又因?yàn)槭浅A?#xff0c;所以對(duì)是s[0]的賦值操作是不合法的。?
115。寫一個(gè)“標(biāo)準(zhǔn)”宏,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)。
答案:.#define Min(X, Y) ((X)>(Y)?(Y):(X)) ?//結(jié)尾沒(méi)有‘;’?
116。嵌入式系統(tǒng)中經(jīng)常要用到無(wú)限循環(huán),你怎么用C編寫死循環(huán)。答案:while(1){}或者for(;;)?
117。關(guān)鍵字static的作用是什么?答案:定義靜態(tài)變量?
118。關(guān)鍵字const有什么含意?答案:表示常量不可以修改的變量。?
119。關(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ù)共享的變量?
?
120。int (*s[10])(int) 表示的是什么啊?
答案:int (*s[10])(int) 函數(shù)指針數(shù)組,每個(gè)指針指向一個(gè)int func(int param)的函數(shù)。?
121。有以下表達(dá)式:?
int a=248; ?int b=4;?
int const c=21; ?const int *d=&a; ?
int *const e=&b; ?int const *f const =&a;?
請(qǐng)問(wèn)下列表達(dá)式哪些會(huì)被編譯器禁止?為什么? *c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;?
答案:
*c 這是個(gè)什么東東,禁止 *d 說(shuō)了是const, 禁止 e = &a 說(shuō)了是const ,?
禁止 const *f const =&a; 禁止?
122交換兩個(gè)變量的值,不使用第三個(gè)變量。即a=3,b=5,交換之后a=5,b=3; 答案:有兩種解法, 一種用算術(shù)算法, 一種用^(異或)
?a = a + b; b = a - b; a = a - b;?
or a = a^b; b = a^b; a = a^b; or a ^= b ^= a; ?// 只能對(duì)int,char.
123.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?
124.進(jìn)程之間通信的途徑答案:共享存儲(chǔ)系統(tǒng)消息傳遞系統(tǒng)管道:以文件系統(tǒng)為基礎(chǔ)?
125.進(jìn)程死鎖的原因答案:資源競(jìng)爭(zhēng)及進(jìn)程推進(jìn)順序非法?
126.死鎖的4個(gè)必要條件答案:互斥、請(qǐng)求保持、不可剝奪、環(huán)路?
127.死鎖的處理答案:鴕鳥(niǎo)策略、預(yù)防策略、避免策略、檢測(cè)與解除死鎖?
128. ?操作系統(tǒng)中進(jìn)程調(diào)度策略有哪幾種?答案:FCFS(先來(lái)先服務(wù)),優(yōu)先級(jí),時(shí)間片輪轉(zhuǎn),多級(jí)反饋?
129.類的靜態(tài)成員和非靜態(tài)成員有何區(qū)別?答案:類的靜態(tài)成員每個(gè)類只有一個(gè),非靜態(tài)成員每個(gè)對(duì)象一個(gè)?
130.純虛函數(shù)如何定義?使用時(shí)應(yīng)注意什么?答案:virtual void f()=0; 是接口,子類必須要實(shí)現(xiàn)?
131.數(shù)組和鏈表的區(qū)別答案:數(shù)組:數(shù)據(jù)順序存儲(chǔ),固定大小連表:數(shù)據(jù)可以隨機(jī)存儲(chǔ),大小可動(dòng)態(tài)改變?
132.ISO的七層模型是什么?tcp/udp是屬于哪一層?tcp/udp有何優(yōu)缺點(diǎn)?
答案:
應(yīng)用層,表示層,會(huì)話層,運(yùn)輸層,網(wǎng)絡(luò)層,物理鏈路層,物理層?
tcp /udp屬于運(yùn)輸層?
TCP 服務(wù)提供了數(shù)據(jù)流傳輸、可靠性、有效流控制、全雙工操作和多路復(fù)用技術(shù)等。與 TCP 不同, UDP 并不提供對(duì) IP 協(xié)議的可靠機(jī)制、流控制以及錯(cuò)誤恢復(fù)功能等。由于 UDP 比較簡(jiǎn)單, UDP 頭包含很少的字節(jié),比 TCP 負(fù)載消耗少。?
tcp: 提供穩(wěn)定的傳輸服務(wù),有流量控制,缺點(diǎn)是包頭大,冗余性不好?
udp: 不提供穩(wěn)定的服務(wù),包頭小,開(kāi)銷小 ?
133:(void *)ptr 和 (*(void**))ptr的結(jié)果是否相同?其中ptr為同一個(gè)指針
答案:.(void *)ptr 和 (*(void**))ptr值是相同的?
134:
int main() ? ?
{ ? ?int x=3; ? ?printf("%d",x); ? ?return 1; ? ? ?} 問(wèn)函數(shù)既然不會(huì)被其它函數(shù)調(diào)用,為什么要返回1?
答案:mian中,c標(biāo)準(zhǔn)認(rèn)為0表示成功,非0表示錯(cuò)誤。具體的值是某中具體出錯(cuò)信息?
136,已知一個(gè)數(shù)組table,用一個(gè)宏定義,求出數(shù)據(jù)的元素個(gè)數(shù)’
答案:
?#define NTBL (sizeof(table)/sizeof(table[0]))?
137 . -1,2,7,28,,126請(qǐng)問(wèn)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)?
138。對(duì)于一個(gè)頻繁使用的短小函數(shù),在C語(yǔ)言中應(yīng)用什么實(shí)現(xiàn),在C++中應(yīng)用什么實(shí)現(xiàn)??
答案:c用宏定義,c++用inline?
139。直接鏈接兩個(gè)信令點(diǎn)的一組鏈路稱作什么? 答案:PPP點(diǎn)到點(diǎn)連接?
140。軟件測(cè)試都有那些種類? 答案:黑盒:針對(duì)系統(tǒng)功能的測(cè)試 ? ?白合:測(cè)試函數(shù)功能,各函數(shù)接口?
141。確定模塊的功能和模塊的接口是在軟件設(shè)計(jì)的那個(gè)隊(duì)段完成的? 答案:概要設(shè)計(jì)階段?
142。enum string ? ?{ ? ?x1, ? ?x2, ? ?x3=10, ? ?x4, ? ?x5, ? ?}x; ? ?問(wèn)x;
答案:取值在0。1。10。11。12中的一個(gè)?
143。
unsigned char *p1; ? ?unsigned long *p2; ? ?
p1=(unsigned char *)0x801000; ? ?
p2=(unsigned long *)0x810000; ? ?
請(qǐng)問(wèn)p1+5= ?; ? ? ? ?p2+5= ?;?
答案:801005;810014。不要忘記了這個(gè)是16進(jìn)制的數(shù)字,p2要加20變?yōu)?6進(jìn)制就是14?
: ?
144.Ethternet鏈接到Internet用到以下那個(gè)協(xié)議? B ?
A.HDLC;B.ARP;C.UDP;D.TCP;E.ID ?
145.屬于網(wǎng)絡(luò)層協(xié)議的是: A ?
A.TCP;B.IP;C.ICMP;D.X.25 ?
146.Windows消息調(diào)度機(jī)制是: C ?
A.指令隊(duì)列;B.指令堆棧;C.消息隊(duì)列;D.消息堆棧;?
147.請(qǐng)問(wèn)下面程序有什么錯(cuò)誤? ? ?
int a[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)語(yǔ)句內(nèi)外換一下?
148。以下是求一個(gè)數(shù)的平方的程序,請(qǐng)找出錯(cuò)誤: ? ?
#define SQUARE(a) ?((a)*(a)) ? ?
int a=5; ? ?int b; ? ?
b=SQUARE(a++);?
答案:這個(gè)沒(méi)有問(wèn)題,s(a++),就是((a++)×(a++))唯一要注意的就是計(jì)算后a=7了?
149。
typedef unsigned char BYTE ? ? ?
int examply_fun(BYTE gt_len; BYTE *gt_code) ? ? ?
{ ? ? ? ?
BYTE *gt_buf; ? ? ?gt_buf=(BYTE *)MALLOC(Max_GT_Length); ? ? ?...... ? ? ?if(gt_len>Max_GT_Length) ? ? ? ?
{ ? ? ? ?
return GT_Length_ERROR; ? ? ? ? ?
} ? ? ??
?....... ? ? ?
} 答案:要釋放內(nèi)存問(wèn)答題:?
150.TCP/IP通信建立的過(guò)程怎樣,端口有什么作用?
答案:三次握手,確定是哪個(gè)應(yīng)用程序使用該協(xié)議?
151、局部變量能否和全局變量重名?
答案:能,局部會(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)?
152、如何引用一個(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ò)?
153、全局變量可不可以定義在可被多個(gè).C文件包含的頭文件中?為什么?答案:可以,在不同的C文件中以static形式來(lái)聲明同名全局變量??梢栽诓煌腃文件中聲明同名的全局變量,前提是其中只能有一個(gè)C文件中對(duì)此變量賦初值,此時(shí)連接不會(huì)出錯(cuò)?
154、static全局變量與普通的全局變量有什么區(qū)別?static局部變量和普通局部變量有什么區(qū)別?static函數(shù)與普通函數(shù)有什么區(qū)別?
答案:全局變量(外部變量)的說(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態(tài)變量后是改變了它的作用域,限制了它的使用范圍。 static函數(shù)與普通函數(shù)作用域不同。僅在本文件。只在當(dāng)前源文件中使用的函數(shù)應(yīng)該說(shuō)明為內(nèi)部函數(shù)(static),內(nèi)部函數(shù)應(yīng)該在當(dāng)前源文件中說(shuō)明和定義。對(duì)于可在當(dāng)前源文件以外使用的函數(shù),應(yīng)該在一個(gè)頭文件中說(shuō)明,要使用這些函數(shù)的源文件要包含這個(gè)頭文件 static全局變量與普通的全局變量有什么區(qū)別:static全局變量只初使化一次,防止在其他文件單元中被引用; static局部變量和普通局部變量有什么區(qū)別:static局部變量只被初始化一次,下一次依據(jù)上一次結(jié)果值; static函數(shù)與普通函數(shù)有什么區(qū)別:static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個(gè)被調(diào)用中維持一份拷貝?
155、判斷題(對(duì)的寫T,錯(cuò)的寫F并說(shuō)明原因,每小題4分,共20分)?
1、有數(shù)組定義int a[2][2]={{1},{2,3}};則a[0][1]的值為0。( ? ?正確 )?
2、int (*ptr) (),則ptr是一維數(shù)組的名字。(錯(cuò)誤 ?int (*ptr) ();定義一個(gè)指向函數(shù)的指針變量 ? ?)?
3、指針在任何情況下都可進(jìn)行>, <,>=, <=,==運(yùn)算。( ?錯(cuò)誤 ?)?
4、switch(c) 語(yǔ)句中c可以是int ,long,char ,float ,unsigned int 類型。( ?錯(cuò),不能用實(shí)形 )?
156、填空題(共30分)?
1、在windows下,寫出運(yùn)行結(jié)果,每空2分,共10分。?
char str[ ]= "Hello"; char *p=str; int n=10; sizeof(str)=( ? ? ?) sizeof(p)=( ? ? ?) sizeof(n)=( ? ? ?) void func(char str[100]){ ? ?} sizeof(str)=( ? ?) ?
答案:6,4,4,4,?
156、 ?不使用庫(kù)函數(shù),編寫函數(shù)int strcmp(char ?*source, char *dest) 相等返回0,不等返回-1;?
答案:一、
int strcmp(char ?*source, char *dest)?
{ ?
assert((source!=NULL)&&(dest!=NULL)); ?
int i,j; ?
for(i=0; source[i]==dest[i]; i++) ?
{ ?
if(source[i]=='\0' && dest[i]=='\0') ? ?
return 0;?
else ? ?
return -1; ?
}?
}?
答案:二、?
int strcmp(char *source, char *dest)
{ ? ?while ( (*source != '\0') && (*source == *dest)) ??
?{
?source++; dest++; ? ?
} ? ?
return ( (*source) - (*dest) ) ? -1 : 0;
?}?
157寫一函數(shù)int fun(char *p)判斷一字符串是否為回文,是返回1,不是返回0,出錯(cuò)返回-1?
答案:一、?
int fun(char *p)
{ ?if(p==NULL) ?
return -1; ?
else ?
{ ?int length = 0; ?int i = 0; ?int judge = 1; ?length = strlen(p); ?
for(i=0; i <length/2; i++) ?
{ ? ?if(p[i]!=p[length-1-i]) ??
?judge = 0; ? ?
break; ?
} ?
if(judge == 0) ? ?
return 0; ?
else ? ?
return 1; ?
}?
}?
答案:二、?
int fun(char *p)
{?
int len = strlen(p) - 1;
char *q = p + len;?
if (!p) return -1;
while (p < q)?
{?
if ((*p++) != (*q--))?
return 0;?
}?
return 1;
} ?
158
1.在OSI 7 層模型中,網(wǎng)絡(luò)層的功能有( B)?
A.確保數(shù)據(jù)的傳送正確無(wú)誤 ?B.確定數(shù)據(jù)包如何轉(zhuǎn)發(fā)與路由 C.在信道上傳送比特流 ? ?D.糾錯(cuò)與流控?
2.FDDI 使用的是___局域網(wǎng)技術(shù)。(C )?
A.以太網(wǎng); ? ?B.快速以太網(wǎng); ? ?C.令牌環(huán); ? ?D.令牌總線。
注: (光纖分布數(shù)據(jù)接口(FDDI)是目前成熟的LAN技術(shù)中傳輸速率最高的一種)
3.下面那種LAN 是應(yīng)用CSMA/CD協(xié)議的(C)?
A.令牌環(huán) ? ?B.FDDI ? ?C.ETHERNET ? ?D.NOVELL?
4.TCP 和UDP 協(xié)議的相似之處是 (C )?
A.面向連接的協(xié)議 ? ?B.面向非連接的協(xié)議 ? ?C.傳輸層協(xié)議 ? ?D.以上均不對(duì)?
5.應(yīng)用程序PING 發(fā)出的是___報(bào)文.(C )
?A.TCP 請(qǐng)求報(bào)文。 ? ?B.TCP 應(yīng)答報(bào)文。 ? ?C.ICMP 請(qǐng)求報(bào)文。 ?D.ICMP 應(yīng)答報(bào)文。?
6.以下說(shuō)法錯(cuò)誤的是(多) (BD )?
A.中繼器是工作在物理層的設(shè)備 ? ?B.集線器和以太網(wǎng)交換機(jī)工作在數(shù)據(jù)連路層 C.路由器是工作在網(wǎng)絡(luò)層的設(shè)備 ? ?D.橋能隔離網(wǎng)絡(luò)層廣播?
7.當(dāng)橋接收的分組的目的MAC地址在橋的映射表中沒(méi)有對(duì)應(yīng)的表項(xiàng)時(shí),采取的策略是( C)
?A.丟掉該分組 ?B.將該分組分片 ? ?C.向其他端口廣播該分組 ? ?D.以上答案均不對(duì)?
8.LAN Switch 在網(wǎng)絡(luò)層次模型中的地位( B)?
A.物理層 ? ?B.鏈路層 ? ?C.網(wǎng)絡(luò)層 ? ?D.以上都不是?
9.小于___的TCP/UDP端口號(hào)已保留與現(xiàn)有服務(wù)一一對(duì)應(yīng),此數(shù)字以上的端口號(hào)可自由分配。( C)?
A.199 ? ? ?B.100 ? ?C.1024 ? ? ?D.2048?
10.當(dāng)一臺(tái)主機(jī)從一個(gè)網(wǎng)絡(luò)移到另一個(gè)網(wǎng)絡(luò)時(shí),以下說(shuō)法正確的是 (B )?
A.必須改變它的IP 地址和MAC 地址 ? ?B.必須改變它的IP 地址,但不需改動(dòng)MAC 地址 C.必須改變它的MAC 地址,但不需改動(dòng)IP 地址 ? ?D.MAC 地址.IP 地址都不需改動(dòng)
159. 找錯(cuò)?
#define MAX_SRM 256?
DSNget_SRM_no()?
{ ? ?
static int SRM_no; ? ?
int I; ? ?
for(I=0;I <MAX_SRM;I++,SRM_no++) ?
{ ? ?
SRM_no %= MAX_SRM; ? ?
if(MY_SRM.state==IDLE) ? ?
{ ? ? ?break; ? ?} ?
} ?
if(I>=MAX_SRM) ? ?
return (NULL_SRM); ?
else ? ?
return SRM_no;?
}?
答: 1,SRM_no沒(méi)有賦初值?
2,由于static的聲明,使該函數(shù)成為不可重入(即不可預(yù)測(cè)結(jié)果)函數(shù),因?yàn)镾RM_no變量放在程序的全局存儲(chǔ)區(qū)中,每次調(diào)用的時(shí)候還可以保持原來(lái)的賦值。這里應(yīng)該去掉static聲明。?
160. 寫出程序運(yùn)行結(jié)果?
int sum(int a)?
{ ? ?auto int c=0; ? ?static int b=3; ?c+=1; ?b+=2; ?return(a+b+c); } ?
void main()?
{ ? ?int I; ?int a=2;?
?for(I=0;I <5;I++) ?
{ ? ?printf("%d,", sum(a)); ?}?
} 答:8,10,12,14,16 該題比較簡(jiǎn)單。只要注意b聲明為static靜態(tài)全局變量,其值在下次調(diào)用時(shí)是可以保持住原來(lái)的賦值的就可以。?
161 int func(int a)?
{ ? ?int b; ? ?
switch(a) ? ?
{ ? ? ? ?
case 1: b=30; ? ? ? ?
case 2: b=20; ? ? ? ?
case 3: b=16; ? ? ??
default: b=0; ??
} ? ?
return b;?
} 則func(1)=? 答:func(1)=0,因?yàn)闆](méi)有break語(yǔ)句,switch中會(huì)一直計(jì)算到b=0。這是提醒我們不要忘了break?
162: ?int a[3]; ?a[0]=0; a[1]=1; a[2]=2; ?int *p, *q; ?p=a; ?q=&a[2]; 則a[q-p]=??
答:a[q-p]=a[2]=2;這題是要告訴我們指針的運(yùn)算特點(diǎn)?
163. 定義 int **a[3][4], 則變量占有的內(nèi)存空間為:_____?
答:此處定義的是指向指針的指針數(shù)組,對(duì)于32位系統(tǒng),指針占內(nèi)存空間4字節(jié),因此總空間為3×4×4=48。
164.設(shè)有int a=3;則執(zhí)行語(yǔ)句a+=a-=a*a;后
變量a的值是? ?
答案:-12
165. Struct RegX
{
long bzy:1;
long wrt:1;
? ?long rd:1;
long cnt:4;
long rsd:25;
};
Sizeof(RegX)=?
答案:4
166?
Char a[]=“hello\0”;
Char al[7]=“hello”;
Char *ps=“hello”;
Strlen(a)= ? Strlen(a1)= ? Strlen(ps)= ?
Sizeof(a)= ? Sizeof(a1)= ? Sizeof(ps)= ?
5 5 5 ,7 7 4?
167.對(duì)于下面的函數(shù),要求打印出”hello”,子程序完全正確的是_(1)(3)_, 一定能打印出”hello”的是_(1)(3)(4)_,有錯(cuò)誤的是__(2)(4)
char *GetHellostr(void);
int main(void)
{
char *ps;
ps= GetHellostr( );
if(ps != NULL)
{
printf(ps);
}
return 0;
}
(1)
char *GetHellostr(void)
{
char *ps=“hello”;
return ps;
}
(2)
char *GetHellostr(void)
{
? ? char a[]=“hello”;
return (char *)a;
}
(3)
char *GetHellostr(void)
{
static char a[]=“hello”;
return (char *)a;
}
(4)
char *GetHellostr(void)
{
char *ps;
ps = malloc(10);
if(NULL ==ps) return NULL;
strcpy(ps,”hello”);
return ps;
}
168.
void foo(void)
{
unsigned int a;
int ?b = -7;
a=6;
(a+b>6)? puts(“>6”):puts(“<=b”);
a=8;
(a+b>8)? puts(“>8”):puts(“<=8”);
}
些函數(shù)執(zhí)行結(jié)果是? ?> 6 ?<=8
169.
下面程序分別只改到一處,就OK了,要求打印出”welcome to ?huawei”
(1)
void main(void)
{
char str1[]=“welcome”;
char str2[]=“to”;
char str3[]=“huawei”;
char str[50];
memcpy(str,str1,sizeof(str1));
memcpy(str+sizeof(str1),str2,sizeof(str2));
memcpy(str+strlen(str1)+strlen(str2), str3,sizeof(str3));
printf(str);
}
(2)
void main(void)
{
char str1[]=“welcome”;
char str2[]=“to”;
char str3[]=“huawei”;
char str[50];
memcpy(str,str1, strlen(str1));
memcpy(str+strlen(str1),str2, strlen(str2));
memcpy(str+strlen(str1)+strlen(str2), str3, strlen(str3));
printf(str);
}
170
Struct tag
{
short c;
long b;
char d;
long a;
}
Sizeof(tag)可能的值?
171.找出程序中的所有錯(cuò)誤
//分配len的長(zhǎng)度的內(nèi)存,內(nèi)存地址由ptr輸出
void test_malloc(char **prt, int len)
{
char *tmp=NULL;
tmp=(char*)malloc(len);
*prt=tmp;
}
void main(void)
{
char *str=“welcome to huawei”;
char *buf;
char c=0xff;
test_malloc(&buf, sizeof(str));//strlen(str)+1
if(buf ==NULL)//(NULL == buf)
{
return;
}
strcpy(buf , str);
if( c==(char)0xff)
{
printf(“OK,str=%s”,buf);
}
else
{
printf(“OH my God!”);
}
free(buf);
}
172.問(wèn)題
union a {
?int a_int1;
?double a_double;
?int a_int2;
};
? typedef struct
{
?a a1;
?char y;
} b;
問(wèn)題sizeof(b) ??
173:下面這個(gè)程序執(zhí)行后會(huì)有什么錯(cuò)誤或者效果:
?#define MAX 255
?int main()
{
? ?unsigned char A[MAX],i;
? ?for (i=0;i<=MAX;i++)
? ? ?A[i]=i;
}
174, 用遞歸法將整數(shù)轉(zhuǎn)化為符串?
Void convert( int n )
{ int i;
Char c;
if ((i=n/10)!=0)
? ?convert(i);
c=n%10 +’0’;
cout<<” “<<c;
}
175 用折半查找法求一個(gè)數(shù)? 數(shù)組a已按從小到大的順序排列
while((!sign) && (bott <= top))
{
mid=(bott + top)/2;
? ? ?if(number ==a[mid])
{
local=mid;
printf(“the local is %d\n”,local);
printf(“the number is%d\n”, number);
sign =true;
}
else if(number <a[min])
? ?top = mid -1;
else
? ?bott=mid+1;
}
176 有一個(gè)字符串,將字符串從第m個(gè)字符開(kāi)始全部復(fù)制到另一個(gè)新字符串?
void copystr( char *p1, char *p2, int m)
{
int n=0;
while(m<m-1)
{
n++;
p1++;
}
while(*p1 !=’/0’)
{
*p2=*p1;
p1++;
p2++;
}
*p2=’/0’;
}
177 排序問(wèn)題?
問(wèn)題一:寫出冒泡排序
void pop_sort(int a[],int N)
{ int tmp, i , j;
for(j=0; j<N; j++)
for( i=0; i<9-j; i++)
if( a[i]>a[i+1])
{tmp=a[i];
a[i]=a[i+1];
a[i+1]=tmp;
}
}
問(wèn)題一:寫出選擇法排序
void select_sort(int a[],int N)
{ int ?i , j, k, t;
for(i=0; i<N; i++)
{
k=i;
? ?for( j=i+1; j<N; j ++)
if( a[j]<ak])
? k=j;
tmp=a[k];
a[k]=a[i];
a[i]=tmp;
}
}
鏈表問(wèn)題匯總
178寫一函數(shù)creat, 用來(lái)建立一個(gè)動(dòng)態(tài)鏈表,各結(jié)點(diǎn)數(shù)據(jù)由鍵盤輸入。
struct student
?{
? long num;
? float score;
? stuent *next;
?};
?
?student *creat (void)
?{
? student *head;
? student *p1=null,*p2=null;
? int n=0;
? p1=p2=new student;
? cin>>p1->num>>p1->score;
? head=null;
? while(p1->num !=0)
? {
? n=n+1;
? if(1==n) head=p1;
? else ?
? p2->next=p1;
? p2=p1;
? p1= new student;
? cin>>p1->mum>>p1->score;
? }
? p2->next =NULL;
? return (head);
?}
?
179,寫一print函數(shù),將鏈表中的各數(shù)據(jù)遍歷輸出
? void print(student *head )
? {
? student *p;
? cout<<"there"<<n<<"records"<<endl;
? p=head;
? if(head!=NULL)
? do
? {
? cout<<p->num<<" "<<p->score<<endl;
? p=p->next;
? }while(p!=NULL)
? }
?
?180.寫一del函數(shù),用來(lái)刪除動(dòng)態(tài)鏈表中,指定的結(jié)點(diǎn)數(shù)據(jù)
?void *del(student *head, long num)
?{
? student *p1,*p2;
? if(head==NULL)
? {return (head);}
? p1=head;
? while(num!=p1->num && p1->next !=NULL)
? {
? p2=p1;
? p1=p1->next;
? }
? if(num == p1->num)
? {
? if(p1==head)
? head=p1->next;
? else
? p2->next=p1->next;
? cout<<"delete:"<<num<<endl;
? n=n-1;
? }
? else
? cout<<"can not find"<<num;
? return(head);
?}
?181 寫一函數(shù)insert,用來(lái)向動(dòng)態(tài)鏈表插入一結(jié)點(diǎn)
?Student *insert(student *head, student *stud)
?{
? student *p0 ,*p1, *p2;
? p1=head;
? p0=stud;
? if(head == NULL)
? {
? head=p0;
? p0->next=NULL;
? }
? else
? {
? while((p0->num >p1->num) && (p1->next!=NULL) )
? {
? p2=p1;
? p1=p1->next;
? }
? if(p0->num <= p1->num)
? {
? if(head ==p1)
? head=p0;
? else
? p2->next=p0;
? p0->next=p1;
? }
? else
? {
? p1->next=p0;
? p0->next=NULL;
? }
? }
? n=n+1;
? return(head);
??
?}
總結(jié)
以上是生活随笔為你收集整理的C语言 ,嵌入式 ,数据结构 面试题目(2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JAVA的MySQL字符串拼接_MySQ
- 下一篇: 人人开源中invalid Code