搜尋
首頁後端開發C#.Net教程C語言自訂函數傳回數組的方法(圖文詳解)


C語言自訂函數傳回數組的方法(圖文詳解)

C語言自訂函數傳回陣列的方法(圖文詳解)

最近看到一些同學問題,有提到:如何在一個函數中傳回數組呢?

能否直接在自訂 函數中,寫成char *型別回傳值,直接回傳呢? ,程式碼如下:

C語言自訂函數傳回數組的方法(圖文詳解)

 

直接傳回str數組名(注意不需要加&,還有很多同學犯這個錯)

但事實上,運行結果並非正常,我們嘗試在調用函數中輸出,可以看到結果並非是原來內容(當然你的電腦輸出可能還不是這個樣子)

如下:

C語言自訂函數傳回數組的方法(圖文詳解)

## 

原因大家可以從str的屬性入手,str本身是一個自訂函數中的局部變數,是一個陣列有一百個位元組,它的生命週期當然也隨著它所在的函數一起,正所謂“一招天子一朝臣”,隨著fun函數調用的結束,其中的各種局部變量也將被系統收回,理所當然的str數組這一百個字節也將被收回,所以”Hello www.dotcpp.com」這串字串也就灰飛煙滅了!自然你在main函數裡再輸出肯定已經不是原來的內容了!

怎麼樣,可以理解吧!

不過,還沒結束,依然有同學繼續問,可為什麼我換成下面這種寫法就可以了呢?

如下圖:

C語言自訂函數傳回數組的方法(圖文詳解)

#答曰:這種寫法情況下,str雖也屬於是局部變量,但不是一個數組,而是一個指針,只有四個字節,存的是在常數區的字符串” Hello www.dotcpp.com”,但請注意,這個字符串在常數區,而不屬於fun函數裡的部分,全程式都可讀,所以return之後依舊存在,回傳的是str裡的值,也就是字串「Hello www.dotcpp.com」的首地址,就是數,其實相當於把這個字串的位址在str手上透過回傳值轉交到p裡。

也可以打個比方:之前只有fun函數知道這個字串,但現在已經馬上不行了,臨終前,交代:「我快不行了,趕緊把'Hello www .dotcpp.com'的藏寶地址(字符串首地址)轉交到main函數裡!”

#然後就return 快馬加鞭的返回到main函數手裡了!隨後消失…

而後,main函數獲得之後,你們也就知道了…

這樣講,大家能理解嗎?

後期C語言逆向分析部分,也會有涉及到此處的原理,大家可以再深入學習理解。

同時,下篇我們將為大家講解如何實作自訂函數的陣列傳遞問題!

透過上一篇的講解,相信大家已經明白直接的return數組的問題以及原因了,今天我們將詳細為大家講解在函數中返回數組的常見辦法。

此類問題,應用場景往往為了解決函數間相互通信,例如某個函數內處理的完的結果資料需要交接給另一個函數的情況,那麼一般來說,總結有以下三種:

1、直接使用全域變數:這種方法最方便,但此方法打破了函數間的通訊及封裝的思想,所以不建議使用,不在今天討論範圍。

2、透過堆區動態開啟記憶體解決:C語言中,我們通常用malloc來在堆區動態開闢內存,利用堆區「現用現開闢,用完手動收回」特點,實現靈活管理。是實際開發中的常用辦法,也是我們今天的主要內容。

3、由呼叫方傳入陣列指標:此種方法不需要函數傳回位址,而是在呼叫時直接傳入陣列位址,委託被呼叫者進行操作,由於此局部變數屬於呼叫方本身,故即便被呼叫方結束記憶體釋放,也不會被影響到該陣列。

下面逐個實驗,對於第二種方法,由於動態開闢內存在堆區,堆區不想上一講中局部變數在堆疊區存儲,系統根據它的生命週期自動收回,而是手動開闢,手動釋放,這樣就可以完全規避問題,例子與效果見下圖:

需要注意的是:記得用完free掉,防止內存洩漏!

C語言自訂函數傳回數組的方法(圖文詳解)

第三種方法:雖然沒有在函數中傳回數組,但也可以解決數組通訊問題,主要想法就是在呼叫方中定義數組,然後將位址傳入,由於記憶體屬於呼叫方,而非被呼叫方,故被呼叫方在呼叫結束後釋放掉記憶體也無所謂。範例程序及效果如下:

C語言自訂函數傳回數組的方法(圖文詳解)

 

關於陣列使用傳遞的總結,大致如上,大家有任何問題和疑問還可以聯絡我們!

感謝大家的閱讀,希望大家收益多多。

推薦教學:《C語言

#

以上是C語言自訂函數傳回數組的方法(圖文詳解)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:CSDN。如有侵權,請聯絡admin@php.cn刪除
使用C#.NET開發:實用指南和示例使用C#.NET開發:實用指南和示例May 12, 2025 am 12:16 AM

C#和.NET提供了強大的功能和高效的開發環境。 1)C#是一種現代、面向對象的編程語言,結合了C 的強大和Java的簡潔性。 2).NET框架是一個用於構建和運行應用程序的平台,支持多種編程語言。 3)C#中的類和對像是面向對象編程的核心,類定義數據和行為,對像是類的實例。 4).NET的垃圾回收機制自動管理內存,簡化開發者的工作。 5)C#和.NET提供了強大的文件操作功能,支持同步和異步編程。 6)常見錯誤可以通過調試器、日誌記錄和異常處理來解決。 7)性能優化和最佳實踐包括使用StringBuild

C#.NET:了解Microsoft .NET框架C#.NET:了解Microsoft .NET框架May 11, 2025 am 12:17 AM

.NETFramework是一個跨語言、跨平台的開發平台,提供一致的編程模型和強大的運行時環境。 1)它由CLR和FCL組成,CLR管理內存和線程,FCL提供預構建功能。 2)使用示例包括讀取文件和LINQ查詢。 3)常見錯誤涉及未處理異常和內存洩漏,需使用調試工具解決。 4)性能優化可通過異步編程和緩存實現,保持代碼可讀性和可維護性是關鍵。

c#.net的壽命:其持久流行的原因c#.net的壽命:其持久流行的原因May 10, 2025 am 12:12 AM

C#.NET保持持久吸引力的原因包括其出色的性能、豐富的生態系統、強大的社區支持和跨平台開發能力。 1)性能表現優異,適用於企業級應用和遊戲開發;2).NET框架提供了廣泛的類庫和工具,支持多種開發領域;3)擁有活躍的開發者社區和豐富的學習資源;4).NETCore實現了跨平台開發,擴展了應用場景。

掌握C#.NET設計模式:從單胎到依賴注入掌握C#.NET設計模式:從單胎到依賴注入May 09, 2025 am 12:15 AM

C#.NET中的設計模式包括Singleton模式和依賴注入。 1.Singleton模式確保類只有一個實例,適用於需要全局訪問點的場景,但需注意線程安全和濫用問題。 2.依賴注入通過注入依賴提高代碼靈活性和可測試性,常用於構造函數注入,但需避免過度使用導致複雜度增加。

現代世界中的C#.NET:應用和行業現代世界中的C#.NET:應用和行業May 08, 2025 am 12:08 AM

C#.NET在現代世界中廣泛應用於遊戲開發、金融服務、物聯網和雲計算等領域。 1)在遊戲開發中,通過Unity引擎使用C#進行編程。 2)金融服務領域,C#.NET用於開發高性能的交易系統和數據分析工具。 3)物聯網和雲計算方面,C#.NET通過Azure服務提供支持,開發設備控制邏輯和數據處理。

C#.NET開發人員社區:資源和支持C#.NET開發人員社區:資源和支持May 06, 2025 am 12:11 AM

C#.NET開發者社區提供了豐富的資源和支持,包括:1.微軟的官方文檔,2.社區論壇如StackOverflow和Reddit,3.GitHub上的開源項目,這些資源幫助開發者從基礎學習到高級應用,提升編程技能。

C#.NET優勢:功能,好處和用例C#.NET優勢:功能,好處和用例May 05, 2025 am 12:01 AM

C#.NET的優勢包括:1)語言特性,如異步編程簡化了開發;2)性能與可靠性,通過JIT編譯和垃圾回收機制提升效率;3)跨平台支持,.NETCore擴展了應用場景;4)實際應用廣泛,從Web到桌面和遊戲開發都有出色表現。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用