📢:如果你也對機器人、人工智能感興趣,看來我們志同道合?
📢:不妨瀏覽一下我的博客主頁【https://blog.csdn.net/weixin_51244852】
📢:文章若有幸對你有幫助,可點贊 👍 收藏 ?不迷路🙉
📢:內容若有錯誤,敬請留言 📝指正!原創文,轉載請注明出處
文章目錄
- 進程和線程有什么區別?
- 程序的局部、全局變量存在于哪里,動態申請數據存在于哪里?
- 靜態局部變量和全局變量的區別
- 關鍵字const有什么作用?
- 關鍵字static有什么作用?
- 局部變量能否和全局變量重名?
- Union和結構體之間的區別
- 什么是指針?
- 棧和堆的區別?
- 什么是內存泄漏?
- 單片機程序跑飛是什么意思?
- 描述一下C語言從代碼到可執行程序的過程
進程和線程有什么區別?
答:進程是并發執行的程序在執行過程中分配和管理資源的基本單位。線程是進程的一個執行單元,是比進程還要小的獨立運行的基本單位。一個程序至少有一個進程,一個進程至少有一個線程。
程序的局部、全局變量存在于哪里,動態申請數據存在于哪里?
答:程序的局部變量存在于棧區;全局變量存在于靜態區;動態申請數據存在于堆區。
靜態局部變量和全局變量的區別
答:靜態局部變量的這種特性,和全局變量非常相似。他們的相同點都是創造和初始化一次,以后調用時值保持上次的不變。不同點在于作用域不同。
關鍵字const有什么作用?
答:用const定義的變量的值是不允許改變的,即不允許給它重新賦值,即使是賦相同的值也不可以。所以說它定義的是只讀變量,這也就意味著必須在定義的時候就給它賦初值。
關鍵字static有什么作用?
答:在C語言中,關鍵字static有三個明顯的作用:
- 在函數體,一個被聲明為靜態的變量在這一函數被調用過程中維持其值不變。
- 在模塊內(但在函數體外),一個被聲明為靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。
- 在模塊內,一個被聲明為靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地范圍內使用。
局部變量能否和全局變量重名?
答:能,局部會屏蔽全局。
局部變量可以與全局變量同名,在函數內引用這個變量時,會用到同名的局部變量,而不會用到全局變量。
對于有些編譯器而言,在同一個函數內可以定義多個同名的局部變量,比如在兩個循環體內都定義一個同名的局部變量,而那個局部變量的作用域就在那個循環體內。
Union和結構體之間的區別
答:結構體類似于一個包裹,結構體中的成員彼此是獨立存在的,分布在內存的不同單元中,他們只是被打包成一個整體叫做結構體而已;共用體中的各個成員其實是一體的,彼此不獨立,他們使用同一個內存單元。可以理解為:有時候是這個元素,有時候是那個元素。更準確的說法是同一個內存空間有多種解釋方式。
什么是指針?
答:指針的實質就是個變量,它跟普通變量沒有任何本質區別。指針完整的名字應該叫指針變量,簡稱為指針。指針的出現是為了實現CPU間接訪問內存地址。
棧和堆的區別?
答:棧區別于堆,它是自主管理內存的;堆管理內存分配靈活,按需分配,也就是程序手動申請&釋放:手工意思是需要寫代碼去申請malloc和釋放free。各進程可以按需申請使用,使用完釋放。大的進程放入到堆內存中,小的進程放入棧中,兩種的特征決定了處理不同的進程。
1.申請方式不同。棧的空間由操作系統自己分配和釋放,堆上的空間手動分配和釋放。
2.申請效率不同。棧由系統自動分配,速度較快,但程序員是無法控制的。堆是由new分配的內存,一般速度較慢,而且容易產生內存碎片,不過用起來最方便。
3.申請大小不同。棧空間有限。在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩余空間時,將提示overflow。因此,能從棧獲得的空間較小
堆是很大的自由存儲區。堆是向高地址擴展的數據結構,是不連續的內存區域。這是由于系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的小受限于計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。
什么是內存泄漏?
答:在調用free歸還(釋放)這段內存之前,指向這段內存的指針p一定不能丟(也就是不能給p另外賦值)。因為p一旦丟失,這段malloc申請來的內存就永遠的丟失了(內存泄漏),直到當前程序結束時操作系統才會回收這段內存。
單片機程序跑飛是什么意思?
答:"單片機程序跑飛"是指由于某些異常情況,使得單片機的程序執行流程脫離預設的正常路徑,導致系統運行不正常。這種現象可能有多種表現,例如:單片機系統不停地重啟,無法進入正常工作狀態。
一個常見的原因是數組越界(數組溢出),即函數中定義的數組元素的個數小于程序中實際使用的數組元素的個數。另一個可能的原因是外部干擾,比如電磁干擾等,這可能導致程序計數器PC的值發生非預期的變化,從而使程序的流向指向不確定區域。
描述一下C語言從代碼到可執行程序的過程
答:一個C語言程序,從代碼到可執行程序的過程需要四個步驟:預處理,編譯 ,匯編,鏈接。
1.預處理
預處理負責對源代碼進行文本處理。主要處理代碼中以字符#開頭的命令。
2. 編譯
編譯期間也要經過多個步驟,由.i的文本文件生成.s的文本文件。此文件為以匯編語句完成的代碼
3.匯編
經過匯編階段把匯編語句轉換為機器指令,由.s的文本文件生成.o的二進制文件。
4.鏈接
鏈接器將所有二進制的目標文件和系統組件組合成一個可執行文件(.exe)。 (需要注意的是,我們在編譯器是針對源文件進行編譯的并且每個源文件都只會編譯一次,所以匯編結束后每個源文件都會生成一個.o文件,這里的目標文件就是這些.o文件。)