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.程序之間通訊的途徑
答 共享儲存系統
訊息傳遞系統
管道:以檔案系統為基礎