華爲軟件研發面試題大全
1、局部變量能否和全局變量重名?
答:能,局部會屏蔽全局。要用全局變量,需要使用"::" ;局部變量可以與全局變量同名,在函數內引用這個變量時,會用到同名的局部變量,而不會用到全局變量。對於有些編譯器而言,在同一個函數內可以定義多個同名的局部變量,比如在兩個循環體內都定義一個同名的局部變量,而那個局部變量的作用域就在那個循環體內。
2、如何引用一個已經定義過的全局變量?
答:extern 可以用引用頭文件的方式,也可以用extern關鍵字,如果用引用頭文件方式來引用某個在頭文件中聲明的全局變理,假定你將那個編寫錯了,那麼在編譯期間會報錯,如果你用extern方式引用時,假定你犯了同樣的錯誤,那麼在編譯期間不會報錯,而在連接期間報錯。
3、全局變量可不可以定義在可被多個.C文件包含的頭文件中?爲什麼?
答:可以,在不同的C文件中以static形式來聲明同名全局變量。
可以在不同的C文件中聲明同名的全局變量,前提是其中只能有一個C文件中對此變量賦初值,此時連接不會出錯.
4、請寫出下列代碼的輸出內容
#include
int main(void)
{
int a,b,c,d;
a=10;
b=a++;
c=++a;
d=10*a++;
printf("b,c,d:%d,%d,%d",b,c,d);
return 0;
}
答:10,12,120
5、static全局變量與普通的全局變量有什麼區別?static局部變量和普通局部變量有什麼區別?static函數與普通函數有什麼區別?
答: 1) 全局變量(外部變量)的說明之前再冠以static 就構成了靜態的全局變量。全局變量本身就是靜態存儲方式, 靜態全局變量當然也是靜態存儲方式。 這兩者在存儲方式上並無不同。這兩者的區別在於非靜態全局變量的作用域是整個源程序, 當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。 而靜態全局變量則限制了其作用域, 即只在定義該變量的源文件內有效, 在同一源程序的其它源文件中不能使用它。由於靜態全局變量的作用域侷限於一個源文件內,只能爲該源文件內的函數公用, 因此可以避免在其它源文件中引起錯誤。
2) 從以上分析可以看出, 把局部變量改變爲靜態變量後是改變了它的存儲方式即改變了它的生存期。把全局變量改變爲靜態變量後是改變了它的作用域,限制了它的使用範圍。
3) static函數與普通函數作用域不同,僅在本文件。只在當前源文件中使用的函數應該說明爲內部函數(static),內部函數應該在當前源文件中說明和定義。對於可在當前源文件以外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件
綜上所述:
static全局變量與普通的全局變量有什麼區別:
static全局變量只初使化一次,防止在其他文件單元中被引用;
static局部變量和普通局部變量有什麼區別:
static局部變量只被初始化一次,下一次依據上一次結果值;
static函數與普通函數有什麼區別:
static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝
6、程序的局部變量存在於(堆棧)中,全局變量存在於(靜態區 )中,動態申請數據存在於( 堆)中。
7、設有以下說明和定義:
typedef union
{
long i;
int k[5];
char c;
} DATE;
struct data
{
int cat;
DATE cow;
double dog;
} too;
DATE max;
則語句 printf("%d",sizeof(struct data)+sizeof(max));的執行結果是:___52____
考點:區別struct與union.(一般假定在32位機器上)
答:DATE是一個union, 變量公用空間. 裏面最大的變量類型是int[5], 佔用20個字節. 所以它的大小是20. data是一個struct, 每個變量分開佔用空間. 依次爲int4 + DATE20 + double8 = 32. 所以結果是 20 + 32 = 52. 當然...在某些16位編輯器下, int可能是2字節,那麼結果是 int2 + DATE10 + double8 = 20
8、隊列和棧有什麼區別?
隊列先進先出,棧後進先出
9、寫出下列代碼的輸出內容
#include
int inc(int a)
{ return(++a); }
int multi(int*a,int*b,int*c)
{ return(*c=*ab); }
typedef int(FUNC1)(int in);
typedef int(FUNC2) (int*,int*,int*);
void show(FUNC2 fun,int arg1, int*arg2)
{
FUNC1 p=&inc;
int temp =p(arg1);
fun(&temp,&arg1, arg2);
printf("%dn",*arg2);
}
main
{
int a;
//局部變量a爲0;
show(multi,10,&a);
return 0;
}
答:110
10、請找出下面代碼中的所有錯誤 (題目不錯,值得一看)
說明:以下代碼是把一個字符串倒序,如“abcd”倒序後變爲“dcba”
#include"string.h"
main
{
char*src="hello,world";
char* dest=NULL;
int len=strlen(src);
dest=(char*)malloc(len);
char* d=dest;
char* s=src[len];
while(len--!=0)
d++=s--;
printf("%s",dest);
return 0;
}
答:
方法1:一共有4個錯誤;
int main
{
char* src = "hello,world";
int len = strlen(src);
char* dest = (char*)malloc(len+1);//要爲分配一個空間
char* d = dest;
char* s = &src[len-1]; //指向最後一個字符
while( len-- != 0 )
*d++=*s--;
*d = 0; //尾部要加’/0’
printf("%sn",dest);
free(dest); // 使用完,應當釋放空間,以免造成內存匯泄露
dest = NULL;
//防止產生野指針
return 0;
}
方法2: (方法一需要額外的存儲空間,效率不高.) 不錯的想法
#include
#include
main
{
char str="hello,world";
int len=strlen(str);
char t;
for(int i=0; i
{
t=str[i];
str[i]=str[len-i-1]; //小心一點
str[len-i-1]=t;
}
printf("%s",str);
return 0;
}
11.對於一個頻繁使用的短小函數,在C語言中應用什麼實現,在C++中應用什麼實現?
c用宏定義,c++用inline
12.直接鏈接兩個信令點的一組鏈路稱作什麼?
PPP點到點連接
13.接入網用的是什麼接口?
V5接口
都用了那些協議?
H.323協議簇、SIP協議、Skype協議、H.248和MGCP協議
15.軟件測試都有那些種類?
黑盒:針對系統功能的測試
白盒:測試函數功能,各函數接口
16.確定模塊的功能和模塊的接口是在軟件設計的那個隊段完成的?
概要設計階段
17.
unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned long *)0x810000;
請問p1+5= ;
p2+5= ;
答案:0x801005(相當於加上5位) 0x810014(相當於加上20位);
選擇題:
ernet鏈接到Internet用到以下那個協議? D
;;;;
22.屬於網絡層協議的是:( B C)
;;;D.X.25
ows消息調度機制是:(C)
A.指令隊列;B.指令堆棧;C.消息隊列;D.消息堆棧;
找錯題:
25.請問下面程序有什麼錯誤?
int a[60][250][1000],i,j,k;
for(k=0;kMax_GT_Length)
{
return GT_Length_ERROR;
}
....... }
答: 死循環//
問答題:
Phone的原理是什麼?
IP電話(又稱IP PHONE或VoIP)是建立在IP技術上的分組化、數字化傳輸技術,其基本原理是:通過語音壓縮算法對語音數據進行壓縮編碼處理,然後把這些語音數據按IP等相關協議進行打包,經過IP網絡把數據包傳輸到接收地,再把這些語音數據包串起來,經過解碼解壓處理後,恢復成原來的語音信號,從而達到由IP網絡傳送語音的目的。
通信建立的過程怎樣,端口有什麼作用?
三次握手,確定是哪個應用程序使用該協議
31.1號信令和7號信令有什麼區別,我國某前廣泛使用的是那一種?
1號信令接續慢,但是穩定,可靠。
7號信令的特點是:信令速度快,具有提供大量信令的潛力,具有改變和增加信令的靈活性,便於開放新業務,在通話時可以隨意處理信令,成本低。目前得到廣泛應用。
32.列舉5種以上的電話新業務
如“鬧鐘服務”、“免干擾服務”、“熱線服務”、“轉移呼叫”、“遇忙回叫”、“缺席用戶服務”、“追查惡意呼叫”、“三方通話”、“會議電話”、“呼出限制”、“來電顯示”、“虛擬網電話”等
四.找錯題:
1.請問下面程序有什麼錯誤?
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;
答: 把循環語句內外換一下
2.#define Max_CB 500
void LmiQueryCSmd(Struct MSgCB * pmsg)
{
unsigned char ucCmdNum;
......
for(ucCmdNum=0;ucCmdNum
{
......;
}
答: 死循環,unsigned int的取值範圍是0~255
3.以下是求一個數的平方的程序,請找出錯誤:
#define SQUARE(a)((a)*(a))
int a=5;
int b;
b=SQUARE(a++);
答:結果與編譯器相關,得到的可能不是平方值.
微軟亞洲技術中心的面試題!!!
1.進程和線程的差別。
答:線程是指進程內的一個執行單元,也是進程內的可調度實體.
與進程的區別:
(1)調度:線程作爲調度和分配的基本單位,進程作爲擁有資源的基本單位
(2)併發性:不僅進程之間可以併發執行,同一個進程的多個線程之間也可併發執行
(3)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但可以訪問隸屬於進程的資源.
(4)系統開銷:在創建或撤消進程時,由於系統都要爲之分配和回收資源,導致系統的開銷明顯大於創建或撤消線程時的開銷。
2.測試方法
答:人工測試:個人複查、抽查和會審
機器測試:黑盒測試和白盒測試
與stack的差別。
答:Heap是堆,stack是棧。
Stack的空間由操作系統自動分配/釋放,Heap上的空間手動分配/釋放。
Stack空間有限,Heap是很大的自由存儲區
C中的malloc函數分配的內存空間即在堆上,C++中對應的是new操作符。
程序在編譯期對變量和函數分配內存都在棧上進行,且程序運行過程中函數調用時參數的傳遞也在棧上進行
ows下的內存是如何管理的?
分頁管理
8.談談IA32下的分頁機制
小頁(4K)兩級分頁模式,大頁(4M)一級
9.給兩個變量,如何找出一個帶環單鏈表中是什麼地方出現環的?
一個遞增一,一個遞增二,他們指向同一個接點時就是環出現的地方
10.在IA32中一共有多少種辦法從用戶態跳到內核態?
通過調用門,從ring3到ring0,中斷從ring3到ring0,進入vm86等等
11.如果只想讓程序有一個實例運行,不能運行兩個。像winamp一樣,只能開一個窗口,怎樣實現?
用內存映射或全局原子(互斥變量)、查找窗口句柄..
FindWindow,互斥,寫標誌到文件或註冊表,共享內存。.
12.如何截取鍵盤的響應,讓所有的'a’變成'b’?
答:鍵盤鉤子SetWindowsHookEx
14.存儲過程是什麼?有什麼用?有什麼優點?
答:我的理解就是一堆sql的集合,可以建立非常複雜的查詢,編譯運行,所以運行一次後,以後再運行速度比單獨執行SQL快很多
late有什麼特點?什麼時候用?
答: Template可以獨立於任何特定的類型編寫代碼,是泛型編程的基礎.
當我們編寫的類和函數能夠多態的用於跨越編譯時不相關的類型時,用Template.
模板主要用於STL中的容器,算法,迭代器等以及模板元編程.
(C++的template是實現在庫設計和嵌入式設計中的關鍵。
template能實現抽象和效率的結合;同時template還能有效地防止代碼膨脹)
16.談談Windows DNA結構的特點和優點。
答:Windows Distributed interNet Application Architecture(Windows分佈式應用結構,簡稱Windows DNA)是微軟創建新一代高適應性商業解決方案的框架,它使公司能夠充分地挖掘數字神經系統的優點。Windows DNA是第一個將Internet、客戶/服務器、和用於計算的PC模型結合並集成在一起的爲新一類分佈式計算方案而設計的應用軟件體系結構
17. 網絡編程中設計併發服務器,使用多進程與多線程,請問有什麼區別?
答:1)進程:子進程是父進程的複製品。子進程獲得父進程數據空間、堆和棧的複製品。
2)線程:相對與進程而言,線程是一個更加接近與執行體的概念,它可以與同進程的其他線程共享數據,但擁有自己的棧空間,擁有獨立的執行序列。
兩者都可以提高程序的併發度,提高程序運行效率和響應時間。
線程和進程在使用上各有優缺點:線程執行開銷小,但不利於資源管理和保護;而進程正相反。同時,線程適合於在SMP機器上運行,而進程則可以跨機器遷移。
思科
1. 用宏定義寫出swap(x,y)
答#define swap(x, y)
x = x + y;
y = x - y;
x = x - y;
2.數組a[N],存放了1至N-1個數,其中某個數重複一次。寫一個函數,找出被重複的數字.時間複雜度必須爲o(N)函數原型:
int do_dup(int a,int N)
答:int do_dup(int a,int N) //未經調試
{
int sun = 0;
int sum2;
for(int i=0;i
{
Sum+=a[i];
}
Sum2 = (1+N-1)*N/2;
Return (sum-sum2);
}
3 一語句實現x是否爲2的若干次冪的判斷
答:方法1)int i = 512;
cout << boolalpha << ((i & (i - 1)) ? false : true) << endl; //位與爲0,則表示是2的若干次冪
2)return (x>>N==1);
gned int intvert(unsigned int x,int p,int n)實現對x的進行轉換,p爲起始轉化位,n爲需要轉換的長度,假設起始點在右邊.如x=0b0001 0001,p=4,n=3轉換後x=0b0110 0001
答:unsigned int intvert(unsigned int x,int p,int n) //假定p=4,n=3
{
unsigned int _t = 0;
unsigned int _a = 1;
for(int i = 0; i < n; ++i)//循環的目的主要是-t
{
_t |= _a; //位或
_a = _a << 1;
}
_t = _t << p; //轉換後_t變爲1110000
x ^= _t; /異或,將原來的位取反
return x;
}
慧通:
1. 什麼是預編譯,何時需要預編譯:
答: 就是指程序執行前的一些預處理工作,主要指#表示的.
何時需要預編譯?
1)、總是使用不經常改動的大型代碼體。
2)、程序由多個模塊組成,所有模塊都使用一組標準的包含文件和相同的編譯選項。在這種情況下,可以將所有包含文件預編譯爲一個預編譯頭。
2. 下述三個有什麼區別?
char * const p;
char const * p
const char *p
解答:
char * const p; //常量指針,p的值不可以修改
char const * p;//指向常量的指針,指向的常量值不可以改
const char *p; //和char const *p
3. 解釋下列輸出結果
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;
結果是:0 0 1 1
解答:str1,str2,str3,str4是數組變量,它們有各自的內存空間;
而str5,str6,str7,str8是指針,它們指向相同的常量區域。
4. 以下代碼中的兩個sizeof用法有問題嗎?[C易]
void UpperCase( char str ) // 將 str 中的小寫字母轉換成大寫字母
{
for( size_t i=0; i
if( 'a'<=str[i] && str[i]<='z' )
str[i] -= ('a'-'A' );
}
char str = "aBcDe";
cout << "str字符長度爲: " << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str );
cout << str << endl;
答:函數內的sizeof有問題。根據語法,sizeof如用於數組,只能測出靜態數組的大小,無法檢測動態分配的或外部數組大小。函數外的str是一個靜態定義的數組,因此其大小爲6,函數內的str實際只是一個指向字符串的指針,沒有任何額外的與數組相關的信息,因此sizeof作用於上只將其當指針看,一個指針爲4個字節,因此返回4。
注意:數組名作爲函數參數時,退化爲指針.
數組名作爲sizeof參數時,數組名不退化,因爲sizeof不是函數.
4. 一個32位的機器,該機器的指針是多少位
指針是多少位只要看地址總線的位數就行了。80386以後的機子都是32的數據總線。所以指針的位數就是4個字節了。
5. 指出下面代碼的輸出,並解釋爲什麼。(不錯,對地址掌握的深入挖潛)
main
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
輸出:2,5
*(a+1)就是a[1],*(ptr-1)就是a[4],執行結果是2,5
&a+1不是首地址+1,系統會認爲加一個a數組的偏移,是偏移了一個數組的大小(本例是5個int)
int *ptr=(int *)(&a+1);
則ptr實際是&(a[5]),也就是a+5
原因如下:
&a是數組指針,其類型爲 int (*)[5];
而指針加1要根據指針類型加上一定的值,
不同類型的指針+1之後增加的大小不同
a是長度爲5的int數組指針,所以要加 5*sizeof(int)
所以ptr實際是a[5]
但是prt與(&a+1)類型是不一樣的(這點很重要)
所以prt-1只會減去sizeof(int*)
a,&a的地址是一樣的,但意思不一樣,a是數組首地址,也就是a[0]的地址,&a是對象(數組)首地址,a+1是數組下一元素的地址,即a[1],&a+1是下一個對象的地址,即a[5].
6.請問以下代碼有什麼問題:
1).
int main
{
char a;
char *str=&a;
strcpy(str,"hello");
printf(str);
return 0;
}
答;沒有爲str分配內存空間,將會發生異常
問題出在將一個字符串複製進一個字符變量指針所指地址。雖然可以正確輸出結果,但因爲越界進行內在讀寫而導致程序崩潰。
Strcpy的在庫函數string.h中.程序的主要錯誤在於越界進行內存讀寫導致程序崩潰//
2).
char* s="AAA";
printf("%s",s);
s[0]='B';
printf("%s",s);
有什麼錯?
答: "AAA"是字符串常量。s是指針,指向這個字符串常量,所以聲明s的時候就有問題。
cosnt char* s="AAA";
然後又因爲是常量,所以對是s[0]的賦值操作是不合法的。
1、寫一個“標準”宏,這個宏輸入兩個參數並返回較小的一個。
答:#define Min(X, Y) ((X)>(Y)?(Y):(X)) //結尾沒有;
2、嵌入式系統中經常要用到無限循環,你怎麼用C編寫死循環。
答:while(1)或者for(;;) //前面那個較好
3、關鍵字static的作用是什麼?
答:1)定義靜態局部變量,作用域從函數開始到結束.
2) 在模塊內的static函數只可被這一模塊內的其它函數調用,這個函數的使用範圍被限制在聲明它的模塊內;
3) 在類中的static成員變量屬於整個類所擁有,對類的所有對象只有一份拷貝
4、關鍵字const有什麼含意?
答 :1)表示常量不可以修改的變量。
2)可以修飾參數,作爲輸入參數.
3)修飾函數,防止以外的改動.
4)修飾類的成員函數,不改變類中的數據成員.
5、關鍵字volatile有什麼含意?並舉出三個不同的例子?
答: 提示編譯器對象的值可能在編譯器未監測到的情況下改變。
例子: 硬件時鐘;多線程中被多個任務共享的變量等
6. int (*s[10])(int) 表示的是什麼啊
int (*s[10])(int) 函數指針數組,每個指針指向一個int func(int param)的函數。
1.有以下表達式:
int a=248; b=4;int const c=21;const int *d=&a;
int *const e=&b;int const *f 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;
or
a = a^b;// 只能對int,char..
b = a^b;
a = a^b;
or
a ^= b ^= a;
3.c和c++中的struct有什麼不同?
答: c和c++中struct的主要區別是c中的struct不可以含有成員函數,而c++中的struct可以。c++中struct和class的主要區別在於默認的存取權限不同,struct默認爲public,而class默認爲private.
4.#include
#include
void getmemory(char *p)
{
p=(char *) malloc(100);
}
int main( )
{
char *str=NULL;
getmemory(str);
strcpy(p,"hello world");
printf("%s/n",str);
free(str);
return 0;
}
答: 程序崩潰,getmemory中的malloc 不能返回動態內存, free對str操作很危險
szstr[10];
strcpy(szstr,"0123456789");
產生什麼結果?爲什麼?
答;正常輸出,長度不一樣,會造成非法的OS,覆蓋別的內容.
6.列舉幾種進程的同步機制,並比較其優缺點。
答:原子操作
信號量機制
自旋鎖
管程,會合,分佈式系統
7.進程之間通信的途徑
答 共享存儲系統
消息傳遞系統
管道:以文件系統爲基礎