4個代碼塊教您如何在C中動態分配2D數組

2020-10-10 編程重度愛好者

以下是在堆上創建2D數組(或動態分配2D數組)的不同方法。

在以下示例中,我們將「 r 」視為行數,將「 c 」視為列數,並創建了一個二維數組,其中r = 3,c = 4,並遵循以下值

1 2 3 4 5 6 7 8 9 10 11 12

1.使用單個指針:
一種簡單的方法是使用簡單的指針算法分配大小為r * c的存儲塊和訪問元素。

#include <stdio.h> #include <stdlib.h> int main() { int r = 3, c = 4; int *arr = (int *)malloc(r * c * sizeof(int)); int i, j, count = 0; for (i = 0; i < r; i++) for (j = 0; j < c; j++) *(arr + i*c + j) = ++count; for (i = 0; i < r; i++) for (j = 0; j < c; j++) printf("%d ", *(arr + i*c + j)); return 0; }

2.使用指針數組
我們可以創建大小為r的指針數組。請注意,從C99開始,C語言允許使用可變大小的數組。創建指針數組後,我們可以為每行動態分配內存。

#include <stdio.h> #include <stdlib.h> int main() { int r = 3, c = 4, i, j, count; int *arr[r]; for (i=0; i<r; i++) arr[i] = (int *)malloc(c * sizeof(int)); count = 0; for (i = 0; i < r; i++) for (j = 0; j < c; j++) arr[i][j] = ++count; // Or *(*(arr+i)+j) = ++count for (i = 0; i < r; i++) for (j = 0; j < c; j++) printf("%d ", arr[i][j]); return 0; }

3.使用指向指針的指針
我們還可以使用雙指針動態創建指針數組。一旦我們動態分配了數組指針,就可以像方法2一樣為每行動態分配內存。

#include <stdio.h> #include <stdlib.h> int main() { int r = 3, c = 4, i, j, count; int **arr = (int **)malloc(r * sizeof(int *)); for (i=0; i<r; i++) arr[i] = (int *)malloc(c * sizeof(int)); count = 0; for (i = 0; i < r; i++) for (j = 0; j < c; j++) arr[i][j] = ++count; for (i = 0; i < r; i++) for (j = 0; j < c; j++) printf("%d ", arr[i][j]); return 0; }

4.使用雙指針和一個malloc調用

#include<stdio.h> #include<stdlib.h> int main() { int r=3, c=4, len=0; int *ptr, **arr; int count = 0,i,j; len = sizeof(int *) * r + sizeof(int) * c * r; arr = (int **)malloc(len); ptr = (int *)(arr + r); for(i = 0; i < r; i++) arr[i] = (ptr + c * i); for (i = 0; i < r; i++) for (j = 0; j < c; j++) arr[i][j] = ++count; for (i = 0; i < r; i++) for (j = 0; j < c; j++) printf("%d ", arr[i][j]); return 0; }

領取免費學習資料以及教程請點擊下方了解更多按鈕:

相關焦點

  • 在C語言中動態內存該如何分配
    要了解在C語言中動態內存是如何分配的,我們首先要了解什麼是內存的動態分配,之前我們已經介紹過全局變量和局部變量,全局變量是分配在內存中的靜態存儲區的,非靜態的局部變量(包括形參)是分配在內存中的動態存儲區的,這個存儲區是一個稱為棧(stack)的區域。
  • 單片機的C語言中數組的用法
    上面的程序中的數組是靜態建立的,以下例程來用說明數組的動態建立。char string[20];c="yahoo"[2]; //c=hstrcpy(string,"123,234,345,456");strcpy(string,get_sub_string(string,2));while(1);}(2)二維數組可由兩個下標確定元素的數組就稱為二維數組
  • C/C++編程筆記:如何在C++中列印數組參數大小?趕緊補課
    今天1024,先祝大家程式設計師節快樂,以後成為了程式設計師可不要天天加班喲~今天呢,筆者就來教你一招,如何計算函數中數組參數的大小?輸出:40 8上面的輸出是針對整數大小為4個字節且指針大小為8個字節的機器的。
  • 如何在C ++中使用參數化構造函數初始化對象數組
    對象數組:定義類時,僅定義對象的規範;沒有分配內存或存儲空間。要使用該類中定義的數據和訪問功能,您需要創建對象。C ++中的「 malloc」或「內存分配」方法用於動態分配具有指定大小的單個大內存塊。它返回類型為void的指針,該指針可以轉換為任何形式的指針。
  • VBA中動態數組的創建及利用
    今日分享的是NO.244,內容是:VBA過程代碼244:VBA中動態數組的定義及創建VBA過程代碼244:VBA中動態數組的定義及創建Sub Mynz()Dim arr() As Stringerow = [c65536].End(3).Row '最後一個非空單元格行號j = 1 '數組索引號
  • 了解C語言內存管理還不是那麼簡單
    尤其對於移動端開發者來說,硬體資源的限制使得其在程序設計中首要考慮的問題就是如何有效地管理內存資源。本文是作者在學習C語言內存管理的過程中做的一個總結。那堆內存如何使用?malloc函數用來在堆中分配指定大小的內存,單位為字節(Byte),函數返回void *指針;free負責在堆中釋放malloc分配的內存。
  • 快速入門學習C Sharp數組的聲明、初始化、賦值、訪問
    在 C# 中聲明一個數組,您可以使用下面的語法:語法:數組類型[] 數組名=new 數組類型[數組長度];重點我們要理解:數組類型、數組長度,也就是說我們可以聲明不同數組類型的數組,也可以聲明不同長度的數組。
  • Filter函數和ReDim語句講解,以及VBA中利用動態數組排重的方法一
    大家好,我們今日繼續講解VBA代碼解決方案的第61講內容:在VBA中如何使用動態數組,以及利用動態數組去除重複值的方法。在上一講中我們講了使用數組函數將單元格中的文本進行分隔後寫入到工作表中的方法,那麼問題來了,如果文本中含有大量的重複值,在寫入時也會將重複值寫入到工作表中,此時,如果我們要剔除重複值,該怎麼辦?用VBA的方法該如何做到呢?我在這講和下一講中將解答這個問題,並提供給讀者一個可以測試的實例。今日先講這個內容要用到的知識點。
  • 一起學Rust編程「9」:動態數組Vectors
    Vector是Rust標準庫提供的動態數組。一個vector對象裡可以保存若干相同類型的數據。[1; 10]; // 10個1現在我們有了數組,如果要向數組尾部添加數據,可以用push方法:a.push(4);對應的,pop方法可以移除並且返回最後一個元素:let last
  • Java二維數組和動態數組ArrayList 類
    Java二維數組Java 語言中提供的數組是用來存儲固定大小的同類型元素//遍歷二維數組public class Traverse_a_two_dimensional_array { public static void main(String[] args) { int[][] arr = {{1,2,3},{4,5,6},{7,8,9}};//靜態創建 //遍歷數組的第一個方法 for(int i = 0;i < arr.length;i++){
  • C語言動態內存管理和動態內存分配
    動態內存管理同時還具有一個優點:當程序在具有更多內存的系統上需要處理更多數據時,不需要重寫程序。標準庫提供以下四個函數用於動態內存管理:(1) malloc()、calloc()分配新的內存區域。(2) realloc()調整已分配的內存區域。(3) free()釋放已分配的內存區域。上述所有函數都聲明在頭文件 stdlib.h 中。對象在內存中所佔空間的大小是以字節數量為單位計算的。
  • C語言編程技巧:以實例跟我學動態數組的創建及使用方法
    但是,在很多情況下,數組元素的個數我們是無法事先確定的。如定義一個數組,用來存儲給定的已知數組中所有大於3的元素,很明顯,這個數組的大小是不確定的,用靜態數組的定義方式是不合適的,除非你定義的數組大小足夠大,能包括足夠多的元素,但這樣會造成內存的浪費。所以,這種場合下動態數組就派上用場了。
  • C/C+編程筆記:C語言中的指針和數組之間的區別?
    指針用於存儲動態分配的數組的地址,以及用於作為參數傳遞給函數的數組。在其他情況下,數組和指針是兩個不同的東西,請參見以下程序以證明此語句的合理性。
  • 在JavaScript中,如何交換數組中的2個元素?
    假設我們有一個包含5個字母的數組a:const a = ['a', 'b', 'c', 'e', 'd']我們想將索引4(本例中為'd')的元素與索引3(本例中為'e')的元素互換。
  • C ++中用於動態內存的new和delete運算符,它來了
    C / C ++中的動態內存分配是指程式設計師手動執行內存分配。動態分配的內存在堆上分配,非靜態和局部變量在堆棧上分配內存。有什麼應用:1.動態分配內存的一種用途是分配可變大小的內存,而可變長度數組除外,這是編譯器分配的內存無法實現的。2.最重要的用途是為程式設計師提供了靈活性。
  • 如何獲取numpy數組地址?如何與ctypes數組共享內存?
    在Python中,當你定義了一個numpy類型的數組後,它內部元素的真實地址如何獲得呢?先改變數組a中第1個元素的值,運行下面的代碼:a[0] = 10 print('a =', a, '\nb =', b[:]}])其運行結果為:a = [10 2 3 4 5] b = [10,
  • FreeRTOS——靜態與動態內存分配
    >Recursive SemaphoresMutexes使用靜態還是動態內存分配是更可取的,取決於應用程式以及應用程式編寫者的偏好。兩種方法都有優點和缺點,並且兩種方法都可以在同一RTOS應用程式中使用。位於FreeRTOS主下載目錄的FreeRTOS / Source / WIN32-MSVC-Static-Allocation-Only目錄中的簡單Win32示例演示了如何創建FreeRTOS應用程式而無需在項目中包含任何FreeRTOS堆實現。
  • 如何獲取numpy數組的真實地址?如何與ctypes數組共享內存?
    a數組內部元素存放的真實地址,第2個元素標明了該數組是否為「只讀」屬性。那麼,如何使用ctypes庫定義一個與numpy共享內存空間的數組變量呢?仍以上面的例子,定義一個uint8類型的數組b,與a數組共享內存區域,可使用下面的代碼:b = (c_uint8*len(a)).from_address(a.
  • 在Stata中編寫估計命令:編寫C語言插件
    這篇文章演示了如何用其他語言(如C,C 或Java)編寫的代碼插入到Stata中。這種技術被稱為Stata編寫插件或編寫動態連結庫(DLL)。本文中,在C語言中編寫一個插件,它實現了mymean11.ado中mymean_work()執行的計算,在文章在Stata中編寫估計命令編寫插件中討論過。
  • 一文讀懂C語言與C++動態內存
    動態內存是從堆上分配,也叫動態內存分配。程式設計師自己負責在何時釋放內存。動態內存的生存期由程式設計師決定,使用非常靈活。C、C++程序編譯的內存分配1.從靜態存儲區域分配內存在程序編譯時就已經分配好,這塊內存在程序的整個運行期間都存在。速度快、不容易出錯,因為有系統會善後。