重解幾道華為經典c語言面試題
1、找錯
void test1()
這裡string陣列越界,因為字串長度為10,還有乙個結束符』\0』。所以總共有11個字元長度。string陣列大小為10,這裡越界了。
ps:使用strcpy函式的時候一定要注意前面目的陣列的大小一定要大於後面字串的大小,否則便是訪問越界。
void test2()
strcpy(string, str1);
}這裡有乙個一眼就能看出的問題,那就是變數i沒有定義,這在**編譯階段編譯器可以幫你發現,很容易搞定。然而很多問題是自己造成的漏洞,編譯器是幫不上什麼忙的。這裡最大的問題還是str1沒有結束符,因為strcpy的第二個引數應該是乙個字串常量。
該函式就是利用判斷第二個引數的結束符來得到是否拷貝完畢。所以在for迴圈後面應加上str1p[9] = 『\0』;
ps:字元陣列和字串的最明顯的區別就是字串會被預設的加上結束符』\0』。
void test3(char* str1)
}這裡的問題仍是越界問題。strlen函式得到字串除結束符外的長度。如果這裡是<=10話,就很明顯越界了。
小結:上面的三個找錯的函式,主要是考查對字串和字元陣列的概念的掌握以及對strcpy函式和strlen函式的理解。
2、找錯
dsn get_srm_no()
}if(i>=max_srm)
return (null_srm);
else
return srm_no;
}這裡for迴圈的判斷語句是後來我加上的,估計在網上流傳的時候被人給弄丟了,根據對程式的分析,給補上了。估計錯誤應該不是這兒。
簡單的閱讀一下這個函式,可以大概的可以猜測出這個函式的功能是分配乙個空閒的sram塊。方法:從上次分配的ram塊後的ram塊開始檢測sram每個ram塊,看是否是idle狀態,如果是idle則返回當前的ram塊的號srm_no。
如果所有的ram塊都不是idle狀態,則意味著無法分配乙個ram給函式呼叫者,返回乙個表示沒有ram可分配的標誌(null_srm)。
經過上面的分析,則這裡可以知道,這個函式的錯誤是for迴圈裡面沒有給srm_no這個變數累加1。
3、寫出程式執行結果
int sum(int a)
void main()
{int i;
int a=2;
for(i=
0;i<5;iprintf("%d,", sum(a執行結果是:8,10,12,14,16,
在求和函式sum裡面c是auto變數,根據auto變數特性知每次呼叫sum函式時變數c都會自動賦值為0。b是static變數,根據static變數特性知每次呼叫sum函式時變數b都會使用上次呼叫sum函式時b儲存的值。
簡單的分析一下函式,可以知道,若傳入的引數不變,則每次呼叫sum函式返回的結果,都比上次多2。所以答案是:8,10,12,14,16,
4、func(1int func(int aint b;
switch(acase 1: 30;
case 2: 20;
case 3: 16;
default: 0return b在 case 語句中可能忘記了對變數b賦值。如果改為下面的**:
int func(int aint b;
switch(acase 1: b = 30;
case 2: b = 20;
case 3: b = 16;
default: b = 0return b因為case語句中漏掉了break語句,所以無論傳給函式的引數是多少,執行結果均為0。
5、a[q - pint a[3];
a[0]=0; a[1]=1; a[2]=2;
int *p, *q;
p=a;
q=&a[2];
很明顯:a[q - p] = a[2] = 2;
6、記憶體空間占用問題定義 int **a[3][4], 則變數占有的記憶體空間為:16位系統24,32位編譯系統中是48。
ps:公式:3 * 4 * sizeof(int7、程式編寫編寫乙個函式,要求輸入年月日時分秒,輸出該年月日時分秒的下一秒。
如輸入2023年12月31日23時59分59秒,則輸出2023年1月1日0時0分0秒。
void resetthetime(int *year,int *month,int *date,int *hour,int *minute,int*secondint dayofmonth[12]={31,28,31,30,31,30,31,31,30,31,30,31if( *year < 0 || *month < 1 || *month > 12 ||
*date < 1 || *date > 31 || *hour < 0 || *hour > 23 ||
*minute < 0 ||*minute > 59|| *second <0 || *second >60 )
return;
if( *year%400 == 0 || *year%100 != 0 && *year%4 == 0 )
dayofmonth[1] = 29if(*second >= 60second = 0;
*minute += 1;
if(*minute >= 60minute = 0;
*hour += 1;
if(*hour >= 24hour = 0;
*date += 1;
if(*date > dayofmonth[*month-1date = 1;
*month += 1;
if(*month > 12month=1;
*year += 1return
華為C語言面試題
華為c語言面試題集 c語言面試題 華為c語言面試題深圳華為面試 1 區域性變數能否和全域性變數重名?答 能,區域性會遮蔽全域性。要用全域性變數,需要使用 區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於有些編譯器而言,在同乙個函式內可以定義多...
華為C語言面試題
華為面試題 怎麼判斷鍊錶中是否有環?bool circleinlist link phead if ptemp ptemp1 return true return false 兩個字串,s,t 把t字串插入到s字串中,s字串有足夠的空間存放t字串 void insert char s,char t,...
c語言面試題之華為面試題
1 區域性變數能否和全域性變數重名?答 能,區域性會遮蔽全域性。要用全域性變數,需要使用 區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於有些編譯器而言,在同乙個函式內可以定義多個同名的區域性變數,比如在兩個迴圈體內都定義乙個同名的區域性變數...