重解幾道華為經典C語言面試題

2021-04-13 00:22:54 字數 3055 閱讀 6815

重解幾道華為經典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、寫出程式執行結果

intsum(int a)

void

main()

} 執行結果是: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(1) = ?

intfunc(int a)

return b;

} 在case 語句中可能忘記了對變數b賦值。如果改為下面的**:

intfunc(int a)

return b;

} 因為case語句中漏掉了break語句,所以無論傳給函式的引數是多少,執行結果均為0。

5、a[q - p] = ?

inta[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(int **) 。

7、程式編寫

編寫乙個函式,要求輸入年月日時分秒,輸出該年月日時分秒的下一秒。如輸入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*second)

; if( *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] = 29;

if(*second >= 60)

} }

} }

return;

}

C語言面試題之華為面試題

1 區域性變數能否和全域性變數重名?答 能,區域性會遮蔽全域性。要用全域性變數,需要使用 區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於有些編譯器而言,在同乙個函式內可以定義多個同名的區域性變數,比如在兩個迴圈體內都定義乙個同名的區域性變數...

經典C語言面試題

1.gets 函式 問 請找出下面 裡的問題 include intmain void 答 上面 裡的問題在於函式gets 的使用,這個函式從stdin接收乙個字串而不檢查它所複製的快取的容積,這可能會導致快取溢位。這裡推薦使用標準函式fgets 代替。2.strcpy 函式 問 下面是乙個簡單的密...

C語言經典面試題

題目 零值比較 bool,int,float,指標變數與零值比較的if語句。1 int型變數 n 與 零值 比較的 if 語句就是 if n 0 if n 0 如下寫法均屬不良風格.if n 會讓人誤解 n 是布林變數 if n 2 請寫出bool flag與 零值 比較的if語句 if flag ...