
Q1、什么是預編譯,何時需要預編譯
答案:1、總是使用不經常改動的大型代碼體,
Q2、程式由多個模塊組成,所有模塊都使用一組標準的包含檔案和相同的編譯選項,在這種情況下,可以將所有包含檔案預編譯為一個預編譯頭,
Q3、下述三個有什么區別?
char * const p
char const * p
const char *p
答案:
char * const p; //常量指標,p的值不可以修改
char const * p;//指向常量的指標,指向的常量值不可以改
const char *p; //和char const *p
Q4、以下代碼中的兩個sizeof用法有問題嗎?
void UpperCase( char str[] ) // 將 str 中的小寫字母轉換成大寫字母
{
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字符長度為: " << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str );
cout << str << endl;
答案:函式內的sizeof有問題,根據語法,sizeof如用于陣列,只能測出靜態陣列的大小,無法檢測動態分配的或外部陣列大小,函式外的str是一個靜態定義的陣列,因此其大小為6,因為還有'\0',函式內的str實際只是一個指向字串的指標,沒有任何額外的與陣列相關的資訊,因此sizeof作用于上只將其當指標看,一個指標為4個位元組,因此回傳4,
Q5、一個32位的機器,該機器的指標是多少位
答案:指標是多少位只要看地址總線的位數就行了,80386以后的機子都是32的資料總線,所以指標的位數就是4個位元組了,
Q6、請問以下代碼有什么問題:
int main()
{
char a;
char *str=&a;
strcpy(str,"hello");
printf(str);
return 0;
}
答案:沒有為str分配記憶體空間,將會發生例外
問題出在將一個字串復制進一個字符變數指標所指地址,雖然可以正確輸出結果,但因為越界進行內在讀寫而導致程式崩潰,
Q7、寫一個“標準”宏,這個宏輸入兩個引數并回傳較小的一個,
答案:.#define Min(X, Y) ((X)>(Y)?(Y):(X)) //結尾沒有‘;’
Q8、嵌入式系統中經常要用到無限回圈,你怎么用C撰寫死回圈,
答案:while(1){}或者for(;;)
Q9、關鍵字static的作用是什么?
答案:定義靜態變數
Q10、關鍵字const有什么含意?
答案:表示常量不可以修改的變數,
Q11、關鍵字volatile有什么含意?并舉出三個不同的例子?
答案:提示編譯器物件的值可能在編譯器未監測到的情況下改變,
Q12、int (*s[10])(int) 表示的是什么啊?
答案:int (*s[10])(int) 函式指標陣列,每個指標指向一個int func(int param)的函式,
Q13、有以下運算式:
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; 禁止
Q14、交換兩個變數的值,不使用第三個變數,即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;
Q15、c和c++中的struct有什么不同?
答案:c和c++中struct的主要區別是c中的struct不可以含有成員函式,而c++中的struct可以,c++中struct和class的主要區別在于默認的存取權限不同,struct默認為public,而class默認為private
Q.16、
#include <stdio.h>
#include <stdlib.h>
void getmemory(char *p)
{
p=(char *) malloc(100);
strcpy(p,"hello world");
}
int main( )
{
char *str=NULL;
getmemory(str);
printf("%s/n",str);
free(str);
return 0;
}
答案:程式崩潰,getmemory中的malloc 不能回傳動態記憶體, free()對str操作很危險
Q17、
.char szstr[10];
strcpy(szstr,"0123456789");
產生什么結果?為什么?
答案: 長度不一樣,會造成非法的OS
Q18、列舉幾種行程的同步機制,并比較其優缺點,
答案: 原子操作
信號量機制
自旋鎖
管程,會合,分布式系統
Q19、行程之間通信的途徑
答案:共享存盤系統
訊息傳遞系統
管道:以檔案系統為基礎
Q20、行程死鎖的原因
答案:資源競爭及行程推進順序非法
Q21、死鎖的4個必要條件
答案:互斥、請求保持、不可剝奪、環路
Q22、死鎖的處理
答案:鴕鳥策略、預防策略、避免策略、檢測與解除死鎖
Q23、作業系統中行程調度策略有哪幾種?
答案:FCFS(先來先服務),優先級,時間片輪轉,多級反饋
Q24、類的靜態成員和非靜態成員有何區別?
答案:類的靜態成員每個類只有一個,非靜態成員每個物件一個
Q25、純虛函式如何定義?使用時應注意什么?
答案:virtual void f()=0;
是介面,子類必須要實作
Q26、陣列和鏈表的區別
答案:陣列:資料順序存盤,固定大小
連表:資料可以隨機存盤,大小可動態改變
Q27、ISO的七層模型是什么?tcp/udp是屬于哪一層?tcp/udp有何優缺點?
答案:應用層、表示層、會話層、運輸層、網路層、物理鏈路層、物理層
tcp /udp屬于運輸層
TCP 服務提供了資料流傳輸、可靠性、有效流控制、全雙工操作和多路復用技術等
與 TCP 不同, UDP 并不提供對 IP 協議的可靠機制、流控制以及錯誤恢復功能等,由于 UDP 比較簡單, UDP 頭包含很少的位元組,比 TCP 負載消耗少,
tcp: 提供穩定的傳輸服務,有流量控制,缺點是包頭大,冗余性不好
udp: 不提供穩定的服務,包頭小,開銷小
Q28、(void *)ptr 和 (*(void**))ptr的結果是否相同?其中ptr為同一個指標
答案:.(void *)ptr 和 (*(void**))ptr值是相同的
Q29、
int main()
{
int x=3;
printf("%d",x);
return 1;
}
問函式既然不會被其它函式呼叫,為什么要回傳1?
答案:mian中,c標準認為0表示成功,非0表示錯誤,具體的值是某中具體出錯資訊
Q30、要對絕對地址0x100000賦值,我們可以用(unsigned int*)0x100000 = 1234;
那么要是想讓程式跳轉到絕對地址是0x100000去執行,應該怎么做?
答案:*((void (*)( ))0x100000 ) ( );
首先要將0x100000強制轉換成函式指標,即:
(void (*)())0x100000
然后再呼叫它:
*((void (*)())0x100000)();
用typedef可以看得更直觀些:
typedef void(*)() voidFuncPtr;
*((voidFuncPtr)0x100000)();
Q31、已知一個陣列table,用一個宏定義,求出資料的元素個數
答案:#define NTBL
#define NTBL (sizeof(table)/sizeof(table[0]))
Q32、執行緒與行程的區別和聯系? 執行緒是否具有相同的堆疊? dll是否有獨立的堆疊?
答案:行程是死的,只是一些資源的集合,真正的程式執行都是執行緒來完成的,程式啟動的時候作業系統就幫你創建了一個主執行緒,
每個執行緒有自己的堆疊,
DLL中有沒有獨立的堆疊,這個問題不好回答,或者說這個問題本身是否有問題,因為DLL中的代碼是被某些執行緒所執行,只有執行緒擁有堆疊,如果DLL中的代碼是EXE中的執行緒所呼叫,那么這個時候是不是說這個DLL沒有自己獨立的堆疊?如果DLL中的代碼是由DLL自己創建的執行緒所執行,那么是不是說DLL有獨立的堆疊?
以上講的是堆疊,如果對于堆來說,每個DLL有自己的堆,所以如果是從DLL中動態分配的記憶體,最好是從DLL中洗掉,如果你從DLL中分配記憶體,然后在EXE中,或者另外一個DLL中洗掉,很有可能導致程式崩潰
Q33、
unsigned short A = 10;
printf("~A = %u\n", ~A);
char c=128;
printf("c=%d\n",c);
輸出多少?并分析程序
答案:第一題,~A =0xfffffff5,int值 為-11,但輸出的是uint,所以輸出4294967285
第二題,c=0x10,輸出的是int,最高位為1,是負數,所以它的值就是0x00的補碼就是128,所以輸出-128,
這兩道題都是在考察二進制向int或uint轉換時的最高位處理,
以上就是華為基礎面試題加答案了,只不過這些是一些基礎的面試題,希望可以幫助大家,覺得這份基礎的面試題滿足不了大家,我這邊還有一些高級的面試題,也是華為的,需要的可以幫忙點個關注,私信或者【點擊這里,暗號CSDN】來找我獲取!純分享!
最后給大家安利一個最近分享比較多的一個PDF檔案,說這份檔案整理的很詳細,需要的也可以來找我,獲取方式就在上方!


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290414.html
標籤:其他
