12個有趣的C語言問答

2021-06-12 11:53:58 字數 2972 閱讀 5737

0,gets() 方法

q:以下**有個被隱藏住的問題,你能找到它嗎?

a:這個不顯眼的問題就是使用了 gets() 方法。此方法接受乙個string型別引數,但是卻沒有檢測此數值是否 有足夠的空間來拷貝資料。所以這裡我們一般用 fgets() 方法將來的更好。

#include

int main(void)  

1,strcpy() 方法q:密碼防護是很基本的功能,看看能否搞定下面這段**?

2,main() 方法的返回型別q:請問下面這段**能否通過編譯?如果能的話,那麼這段**中隱含什麼問題嗎?

#include

void main(void)  

else

return;  

a:答案是**能通過編譯,但是會留下針對main()方法的返回型別的警告。main()方法的真正返回型別應該為』int』而非』void』。這是因為』int』返回型別能夠讓程式返回狀態值。尤其是當這段程式作為其他應用的附屬程式時這個狀態值將更加重要。

3,記憶體洩露

q:請問以下**有記憶體洩露嗎?

#include

void main(void)  

else

return;  

a:好,雖然上面的**沒有對指標 ptr 進行記憶體釋放,但實際上即使是程式結束也不會造成記憶體洩露,因為當程式結束時所有一開始被佔據的記憶體就全部清空了。但如果上面這段**是在 while 迴圈裡面那將會造成嚴重的問題

4,free() 方法

q:以下**當使用者輸入』freeze』時會奔潰,而如果輸入』zebra』則執行正常,這是為什麼?

#include

int main(int argc, char *argv)  

else

if(argc == 1)  

else

if(*ptr == 'z')  

free(ptr);  

}  return 0;  

a:問題的根源是因為**在while迴圈中改變了 ptr 指標的位址。當輸入為』zebra』時,while迴圈甚至在執行 第一遍前就結束了,所以free()釋放的記憶體位址就是一開始malloc()分配的位址。但是當輸入』freeze』時, ptr記錄的位址在while迴圈中被更改,因為將會是錯誤的位址傳遞到free()方法中引起崩潰。

5,atexit with _exit

q:在以下**,atexit()方法並沒有被呼叫,你知道為什麼嗎?

#include

void func(void)  

int main(void)  

a:這是因為使用了 _exit() 方法。此方法並沒有呼叫清除資料相關的方法,比如 atexit()等。

6,void* 與 c 結構體

q:能否設計乙個方法接受任意型別的引數然後返回整數?同時是否有辦法傳遞多個這樣的引數?

a:乙個能接受任意型別引數的方法像下面這個樣子:

int func(void *ptr) 

如果需要傳遞多個引數,那麼我們可以傳遞乙個包含這些引數的結構體

7,* 與 ++ 操作符

q:以下**將輸出什麼?為什麼?

#include

int main(void)  

a:以上的輸出將是:

因為++與 * 的優先順序一樣,所以 *ptr++ 將會從右向左操作。按照這個邏輯,ptr++ 會先執行然後執行*ptr。所以第乙個結果是』l'。也因為 ++ 被執行了,所以下乙個printf() 結果是』i'。

8,****** changes in code segment

q:以下**執行時一定會崩潰,你能說出原因嗎?

#include

int main(void)  

a:這是因為,通過 *ptr = 『t』,此行**嘗試更改唯讀記憶體儲存的字串』linux』。此操作當然行不通所以才會造成崩潰。

9,process that changes its own name

q:你能否寫乙個程式在它執行時修改它的名稱?

a:以下**可以完成

#include

int main(int argc, char *argv)  

a,區域性變數的返回位址q:下面的**有問題嗎?如果有,如何修改?

#include

int* inc(int val)  

int main(void)  

a:雖然上面的**有時執行會很好,但是在方法 inc() 中有很嚴重的隱患。當inc()方法執行後,再次使用區域性變數的位址就會造成不可估量的結果。解決之道就是傳遞變數a的位址給main()。

b,處理 printf() 引數

q:以下**輸出請問是什麼?

#include

int main(void)  

a:輸出將是

110..40..60 

這是因為引數都是從右向左處理的,然後列印出來卻是從左向右。

英文原文:

12個有趣的C語言問題

摘要 12個c語言面試題,涉及指標 程序 運算 結構體 函式 記憶體,看看你能做出幾個!1.gets 函式 問 請找出下面 裡的問題 include int main void 答 上面 裡的問題在於函式gets 的使用,這個函式從stdin接收乙個字串而不檢查它所複製的快取的容積,這可能會導致快取...

12個有趣面試題(C語言)

1.gets 函式 includeint main int argc,char argv 答 上面 裡的問題在於函式gets 的使用,這個函式從stdin接收乙個字串而不檢查它所複製的快取的容積,這可能會導致快取溢位。這裡推薦使用標準函式fgets 代替。修改 gets buff 替換 fgets ...

12個有趣的C語言面試題

摘要 12個c語言面試題,涉及指標 程序 運算 結構體 函式 記憶體,看看你能做出幾個!1.gets 函式 問 請找出下面 裡的問題 include int main void 2.strcpy 函式 問 下面是乙個簡單的密碼保護功能,你能在不知道密碼的情況下將其破解嗎?include int ma...