c c 9個冷門問題

2021-07-26 18:38:14 字數 1705 閱讀 8307

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

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

#include

int main(void)

密碼防護是很基本的功能,看看能否搞定下面這段**?

#include

int main(int argc, char *argv)

if(flag)

else

return 0;}

請問下面這段**能否通過編譯?如果能的話,那麼這段**中隱含什麼問題嗎?

#include

void main(void)

else

return;

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

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

#include

void main(void)

else

return;

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

valgrind

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

#include

int main(int argc, char *argv)

else if(argc == 1)

else

if(*ptr == 'z')

free(ptr);

}return 0;

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

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

#include

int main(void)

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

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

a:以下**可以完成

#include

int main(int argc, char *argv)

下面的**有問題嗎?如果有,如何修改?

#include

int* inc(int val)

int main(void)

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

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

#include

int main(void)

輸出將是

110..40..60

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

用這9個問題來審視自己

一 為什麼不能宣洩 如果上述的問題都還不能給自己帶來幸福,那麼何必強求把所有的不快都壓在心頭呢?既然情緒是健全心理中不可缺少的一面,騰不出空間來快樂,就會騰出空間憂傷,那把衝動的情緒釋放出來也未嘗不可 只要不影響到別人的生活,只要不給自己帶來後遺症。二 有必要去補救嗎 揹著過去的沉重包袱有什麼用呢?...

44個javascript問題 9 來自知乎

function showcase value showcase new string a 輸出結果是do not know 這裡主要看new string a 返回什麼,以下做個試驗。console.log new string bggg 輸出 string bggg 並不是預料中的bggg.ne...

從入門到熟悉 HTTPS 的 9 個問題

q1 什麼是 https?bs https 是安全的 http http協議中的內容都是明文傳輸,https的目的是將這些內容加密,確保資訊傳輸安全,最後乙個字母s 指的是 ssl tls 協議,它位於 http 協議與 tcp ip 協議中間。q2 你說的資訊傳輸安全是什麼意思 bs 資訊傳輸的安...