C語言編程技巧:以實例跟我學動態數組的創建及使用方法

2021-01-15 編碼那些事

問題提出

在C語言編程中,對於普通數組的定義,如定義一個包含10個int類型元素的一維數組a,我們採用下面的方式:

int a[10];

這種方式定義的數組是靜態數組,其特點是定義方便,無需管理其內存的佔用情況,但其缺點是一旦定義後,其數組的長度就固定了,而不能動態的改變其大小。

但是,在很多情況下,數組元素的個數我們是無法事先確定的。如定義一個數組,用來存儲給定的已知數組中所有大於3的元素,很明顯,這個數組的大小是不確定的,用靜態數組的定義方式是不合適的,除非你定義的數組大小足夠大,能包括足夠多的元素,但這樣會造成內存的浪費。所以,這種場合下動態數組就派上用場了。

在C語言中提供了諸如內存的申請、釋放等管理函數,然後結合指針可以按需動態地分配內存空間,來構建動態數組,達到有效利用計算機內存資源的手段。

基本函數說明

C語言中用於動態數組操作的函數主要包括malloc、calloc、realloc和free等,每個函數的原型、參數意義及功能說明如下表所示:

下面通過一個例子演示動態數組的創建及使用方法。

例子說明

編寫一個控制臺程序,能夠創建包含n個元素的動態數組,其n值由用戶輸入,數組裡面存儲的內容是n個0-9之間的隨機數。可以通過輸入不同的n值反覆創建不同個數的動態數組,當n值輸入小於等於0的數值時,程序退出。

C語言實現代碼

完整的C語言實現代碼如下:

代碼簡要解釋如下:

第9行,定義一個指向int型的指針p,其對應的內存空間用以存儲動態數組的元素。

第13-14行,輸入動態數組的元素個數,存儲到變量n中。

第16行,使用malloc函數申請能包含n個元素(n*4個字節)的地址空間,將返回的void型指針強制轉換為指向int型的指針賦予p。

第19-22行,為動態數組中的每個元素賦值(0-9之間的隨機數)。

第25-29行,在控制臺上列印動態數組中的每個元素。

第31-36行,使用free函數釋放動態內存。

程序運行結果如下圖所示:

總結

C語言中關於動態數組的編程,需要注意的是,在動態數組使用完畢後,不要忘記使用free函數將動態申請的內存釋放,否則會造成內存洩露。

如果你覺得這篇文章對你有用的話,請不要忘記點讚哦。

相關焦點

  • C語言編程技巧:跟我學如何定義及使用一個字符串數組
    實現目的我們在用C語言編寫程序時,經常會遇到使用字符串數組的情況,這種數組的特點是, 數組中的每個元素都是一個字符串,但每個字符串的長度卻不相同。如果你使用C++語言進行編程的話,實現起來相對比較簡單,只需直接選擇標準模板庫的字符串string類,在代碼中定義該類的一個數組即可實現。現在的問題是,在純C語言中如何定義這樣的一個字符串數組呢?如對於下面的一個字符串數組:str = {「I love C.」,「I love C++.」,「I love JAVA.」
  • 在VBA中如何使用動態數組,以及利用動態數組去除重複值的方法
    大家好,我們今日繼續講解VBA數組與字典解決方案第22講:在VBA中如何使用動態數組,以及利用動態數組去除重複值的方法。如果文本中含有大量的重複值,此時,如果我們要剔除重複值,該怎麼辦?用VBA的方法該如何做到呢?我在這講和下一講中將解答這個問題,並提供給讀者一個可以測試的實例。今日先講這個內容要用到的知識點。
  • VBA中動態數組的創建及利用
    今日繼續和大家分享VBA編程中常用的常用「積木」過程代碼。這些內容大多是我的經驗的記錄,來源於我多年的經驗。今日分享的是NO.244,內容是:VBA過程代碼244:VBA中動態數組的定義及創建VBA過程代碼244:VBA中動態數組的定義及創建Sub Mynz()Dim arr() As Stringerow = [c65536].End(3).Row '最後一個非空單元格行號j = 1 '數組索引號
  • 單片機的C語言中數組的用法
    數組是由具有相同類型的數據元素組成的有序集合。數組是由數組名來表示的,數組中的數據由特定的下標來唯一確定。引入數組的目的,是使用一塊連續的內存空間存儲多個類型相同的數據,以解決一批相關數據的存儲問題。數組與普通變量一樣,也必須先定義,後使用。數組在C51語言的地位舉足輕重,因此深入地了解數組是很有必要的。
  • Python編程數組怎麼創建?4張圖講盡Numpy包所有數組創建函數
    在Python編程和學習中,特別是在科學計算中,不可避免地要創建大量數組。為了將文本中的數據讀取數組中,你還在編寫讀取程序嗎?Numpy中數組創建函數一條命令就能幫你解決。Python語言本身沒有數組這種類型,Numpy包幾乎是為Python數組量身定做的,也是Python中經典包之一。Numpy包集成了大量的函數用來創建各種數組,功能很強大,而我們往往忽略了這些函數。由於我們不知道Numpy的函數有哪些功能,而使用額外的代碼來實現,浪費了時間和精力。
  • Python使用ctypes模塊調用DLL函數之C語言數組與numpy數組傳遞
    在Python語言中,可以使用ctypes模塊調用其它如C++語言編寫的動態連結庫DLL文件中的函數,在提高軟體運行效率的同時,也可以充分利用目前市面上各種第三方的DLL庫函數,以擴充Python軟體的功能及應用領域,減少重複編寫代碼、重複造輪子的工作量,這也充分體現了Python語言作為一種膠水語言所特有的優勢
  • Python語言中使用array模塊實現動態數組的操作
    背景對於動態數組諸如創建、插入、刪除、查詢大小等操作,在C/C++語言中,可以使用標準庫中的vector類實現,而在python語言中,也同樣提供了內置的array模塊實現類似的功能。Python中的array類似於列表list,如都可以動態增刪元素,但又有所區別,list中存儲的元素類型可以不一樣,但array中元素類型必須完全一樣。另外,由於list中每個元素同時存儲了其地址即指針(用以標記每個元素的數據類型)和實際的數據,所以,在存儲及操作效率上,array又遠遠高於列表。下面通過例子講解array模塊的常用操作。
  • C語言編程:以實例教你學指向函數的指針
    指針是C語言的精髓,對於初學者來講,指針是C語言語法學習中比較難的知識點,而這裡面指向函數的指針更是不太容易理解。下面給大家講下怎樣學習理解C語言中指向函數的指針及編程方法和使用例子。注意:這是一篇關於C語言編程的基礎語法內容,C語言大神請繞過。
  • C語言編程技巧:控制臺程序中自定義函數實現數組內容的特定顯示
    在用C語言編寫算法調試方面的程序中,經常會遇到這種情況,在不同地方需要對處理後的數組內容多次進行顯示,並且很多情況下並非顯示數組裡面的全部內容,而僅僅是想觀察數組中的部分數據內容,若每次顯示時都用printf函數寫的話,未免太過麻煩了。
  • 在Delphi XE7下如何建立動態數組呢?
    在Delphi XE7中Object Pascal有了一個很有意義的新功能,Object Pascal提供了初始化動態數組,並改進了它的工作與操作模式。那麼新的Delphi XE7中, Object Pascal語言可以讓我們做那些新的業務呢?大致來說有以下幾點:1.
  • 和大家分享JS編程知識之JS內置對象實例詳解
    本次主要是通過實例來和大家一起分享學習,分享學習什麼是對象,以及String字符串對象,Data日期對象,Array數組對象,Math對象的常用方法的使用。自定義對象示例中定義並創建了一個叫people的對象,它有屬性name和age,分別對這兩個屬性賦了值,然後通過document.write()列印出來。2)、使用函數來定義對象,然後創建新的對象實例。
  • C語言基礎教學檔案!編號零零肆
    C語言關鍵字由於每種語言都有構造語句的單詞,因此C編程還具有具有特定含義的單詞,用於構造c程序指令。在C程式語言中,關鍵字是具有預定義含義的特殊單詞。關鍵字在C程式語言中也稱為保留字。在C程式語言中,有32個關鍵字。所有32個關鍵字都有自己的含義,編譯器已經知道了。
  • C/C+編程筆記:C語言編程面試常見問題,全是經典題!
    如果有剛剛學習編程的小夥伴也可以看一下,都是當時大學應該學懂的,但是因為我以前沒有好好聽課,有些也沒有注意到,現在也是提醒大家吧~ C語言的主要特徵是什麼?
  • 「JAVA」萬字長篇詳述字節碼對象與反射機制完成動態編程
    當第一次使用類的時候,該類的字節碼文件會被加載到JVM中,創建一個字節碼對象;此時,該字節碼對象就是一個Class實例。既然每一個類都有一個Class對象,那麼這些Class對象之間是如何區分它所表示的是哪一個類的字節碼的呢?為了解決這個問題,Java 為Class提供了泛型:Class<T>。
  • C語言基礎:以實例跟我學while循環結構,計算圓周率pi
    循環結構是程式語言中的一種基本程序結構,C語言中有兩種表示方法,分別可通過for循環和while循環結構實現。上篇文章已經講了for循環的使用方法,詳細請參考:這次通過一個計算圓周率pi的例子給大家介紹C語言中while循環結構的編程方法。
  • Filter函數和ReDim語句講解,以及VBA中利用動態數組排重的方法一
    大家好,我們今日繼續講解VBA代碼解決方案的第61講內容:在VBA中如何使用動態數組,以及利用動態數組去除重複值的方法。在上一講中我們講了使用數組函數將單元格中的文本進行分隔後寫入到工作表中的方法,那麼問題來了,如果文本中含有大量的重複值,在寫入時也會將重複值寫入到工作表中,此時,如果我們要剔除重複值,該怎麼辦?用VBA的方法該如何做到呢?我在這講和下一講中將解答這個問題,並提供給讀者一個可以測試的實例。今日先講這個內容要用到的知識點。
  • Python使用ctypes模塊調用DLL函數之複數數組的參數傳遞
    這兒就涉及到了如何將C語言中的複數數組(Complex array)類型與Python中的數據類型進行交互的問題。在Python語言中,可以使用ctypes模塊調用其它如C++語言編寫的動態連結庫DLL文件中的函數,前面多篇文章中已經講了傳遞數值/指針/字符串參數、傳遞結構體參數、傳遞普通數組類型的例子,大家可以回看一下,這樣可以更好的理解本次要講的內容。
  • 怎麼理解php中的數組?php的數組創建和使用方法是什麼?
    數組中的元素是什麼?在數組中每一個值叫做數組的元素。也可以在方括號使用索引添加新元素,或者把新的值賦給已知數組元素。$myarray[3]=『four』;數組的創建方法PHP中,創建數組最簡單的辦法是使用array命令如下:$myarray=array(『one』,2,『three』);這段代碼是創建了一個叫$my array的數組,它包含了三個值:『one』,2,『three』,在這個數組中第一個和第三個包含了字符串,而第二個包含了一個數字。
  • 快速上手系列-C語言之數組
    類似這樣的問題,用數組就很好解決,同樣的問題我們可以用 int ages[50]; 來表示,簡單明了。繼上一篇《快速上手系列-C語言之基礎篇(二)》寫數據類型和運算符相關內容之後,這裡簡單介紹一下C語言中非常常用的一種數據結構,即數組。
  • 程式語言新寵兒——Julia誕生記
    讓我們來一同走進它:為什麼要創建Julia程式語言?用一句話來說,因為我們求知若渴、不斷追求。當需要動態函數時,需要利用泛型編程來編寫算法並將其應用到類型中,尋求最佳方法從多重角度且有效的為所有函數挑選參數,通過數十種方法來定義不同類型間的共同特性,付出這麼多的努力,我們無非是想語言變得更加簡單、乾淨。所有這些要求看起來並不過分,對嗎?