1. 程式人生 > >C語言中動態申請連續的二維陣列

C語言中動態申請連續的二維陣列

      可以採用多申請一些指標,然後這一些指標分別指向後面資料區中對應的位置,如一個3*4int型別陣列,我們先申請大小為sizeof(int*) * 3 + 3 * 4 * sizeof(int)的一維陣列設為arr。然後arr[0]存放指向arr + sizeof(int*) * 3這個位置的指標,arr[1]存放指向arr + sizeof(int*) * 3 + 4 * sizeof(int)這個位置的指標, arr[2]存放指向arr + sizeof(int*) * 3 + 2 * 4 * sizeof(int)這個位置的指標

程式碼如下:
#include "StdAfx.h"
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h> 

// BYTE型顏色:RGB
typedef unsigned char  BYTE;
typedef struct tagBYTECOLORRGB
{
	BYTE red;
	BYTE green;
	BYTE blue;
}BYTECOLORRGB;

//動態申請二維陣列  
template <typename T>  
T** malloc_Array2D(int row, int col)  
{  
	   int size = sizeof(T);  
	   int point_size = sizeof(T*);  
	   //先申請記憶體,其中point_size * row表示存放row個行指標  
	   T **arr = (T **) malloc(point_size * row + size * row * col);  
	   if (arr != NULL)  
	   {     
		   memset(arr, 0, point_size * row + size * row * col);  
		   T *head = (T*)((BYTECOLORRGB*)arr + point_size * row);  
		   while (row--)  
			            arr[row] = (T*)((BYTECOLORRGB*)head + row * col * size);  
	   }  
	   return (T**)arr;  
}  


//釋放二維陣列  
void free_Aarray2D(void **arr)  
{  
	if (arr != NULL)  
		free(arr);
	arr =NULL;
}  


int main()  
{  
	printf("請輸入行列(以空格分開): ");  
	int nRow, nCol;  
    scanf("%d %d", &nRow, &nCol);  
    //動態申請連續的二維陣列  
	BYTECOLORRGB **p = malloc_Array2D<BYTECOLORRGB>(nRow, nCol);  
	//為二維陣列賦值     
	p[0][0].red = 20;
	printf("%4d ", p[0][0].red);
    free_Aarray2D((void**)p);  
    return 0;  
}  


相關推薦

C語言動態申請連續陣列

      可以採用多申請一些指標,然後這一些指標分別指向後面資料區中對應的位置,如一個3*4的int型別陣列,我們先申請大小為sizeof(int*) * 3 + 3 * 4 * sizeof(in

c語言動態開闢一個陣列

// 動態開闢一個二維陣列 #include <stdio.h> #include <stdlib.h> int main() { int i = 0; int j = 0; int line = 0; int row =

malloc動態申請一個陣列的兩種方法

方法一:利用二級指標申請 #include <stdio.h> #include <malloc.h> const int num = 2; int main() { int **a = (int**)malloc(num*sizeof(int*)); for (i

C語言程式設計-指標遍歷陣列

筆記: 一:操作方法 ①a[1][2]地址為:a[1]+2,*(a+1)+2 ((a+1)第二行地址,*(a+1)+2第二行第一列地址),&a[1][2] ②a[1][2]值為:*(a[1]+2

C++ vector 實現動態大小的陣列

      為什麼會寫這個文章呢?是因為最近做一個opencv相關的專案,涉及到儲存畫素座標,但是我並不知道畫素的數量,所以想建立一個二維陣列來動態儲存畫素的x,y座標。由書上的知識可知,C++中的二維陣列實質上是一維數組裡儲存的元素仍然是一維陣列,而且在定義的時候必須指定陣

C語言:使用指標操作陣列

任務程式碼: (1)用指向二維陣列元素的指標: #include <stdio.h> int main( ) { int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int *p; for(p=a

c++ 動態建立的陣列儲存到csv檔案

void PreProcessFunction::saveTwoDimentionArr2csv(signed short **arr, int row, int col, char*filename) { ofstream outFile; outFile.open(f

C語言動態內存的分配

成功 col 釋放內存 否則 turn stdlib.h color span 數組名 動態內存分配:根據需要隨時開辟,隨時釋放的內存分配方式。分配時機和釋放時機完全由程序員決定,由於沒有數據聲明,這部分空間沒有名字。無法像使用變量或數組那樣通過變量名或數組名引用其中的數據

vector儲存指標 和 陣列動態分配記憶體

int num = 2; vector<int*> v(16); v.push_back(NULL); v.push_back(&num); v.push_back(NULL);

C#如何獲取一個陣列的兩長度,即行數和列數?

int[,] array = new int[,] {{1,2,3},{4,5,6},{7,8,9}};//定義一個3行3列的二維陣列 int row = array.Rank;//獲取行數 int col = array.GetLength(1);//獲取指定維中的元 個

C語言動態分配陣列

摘要的重要性是不言而喻的,每次發文章我都很糾結如何寫出一個有特色的摘要來,能夠以最為簡短的文字向讀者描述出我所要表達的東西。但是常常出現的問題是,摘要寫得太簡短了,讀者看了不清楚文章究竟要講啥;摘要寫得稍微長點的話自然能夠描述清楚所要表達的東西,但是卻也出現了另外一個問題,

C語言動態分配陣列指標的釋放問題

我們都知道要實現根據程式的需要動態分配儲存空間,在C中需要使用到stdlib.h中的兩個函式,malloc,free,兩個函式的介紹如下: malloc函式的原型為: void *malloc (u igned int size) 其作用是在記憶體的動態儲存區中分配一個長

c語言獲得動態分配記憶體後的陣列記憶體大小

c語言獲得動態分配記憶體後的陣列記憶體大小 用一個函式 :_msize(); ★注意:該函式為Windows獨有★ int* s = (int*)malloc(sizeof(int));     int i;     for(i

JavaArrays.toString ()列印陣列及Array陣列的常用操作

1.Java中Arrays.toString () 已知列印一維陣列的API為System.out.println ( Arrays.toString ();,其引數為陣列名或陣列指標,其支援的資料型別有很多,如:int[]、char[]、byte[]等。 import java

c/c++---之用二級指標操作陣列

通過二級指標去訪問二維陣列需要先給二級指標分配等同於二維陣列行數的一維陣列指標,然後把二維陣列的每行首地址賦值給對應位置的一維指標上。之後就可以通過二維指標直接訪問了。 參考程式碼如下,可以看具體註釋輔助理解。   #include

C語言空格符、空字元、字元陣列結束符、換行、回車的區別

       空格符和空字元是不一樣的,在ASCII裡面,空格(space)符號的ASCII碼是32,而空字元是0, 2個是完全不一樣的2個字元         空字元 一般來描述一個字串的結尾,其實是控制符的一種,但不能理解為沒有字元,應該理解為代表什麼都沒有的字元.好比回車0x0A和換行0x0D雖然

C語言關於未填滿字元陣列的值(VS2015)

      今天遇到一個bug,除錯了半天發現是因為字串未填滿部分的值超出了函式引數範圍造成的。以前看書上說未初始化的陣列是垃圾資料,未填滿的字串會被自動初始化為0。今天發現僅當在定義陣列的同時對陣列進行初始化時是這樣。在已經定義字串後,利用函式對字串進行賦值時,未填滿打的

從txt讀取資料存入陣列

在實際應用中,經常需要把txt中的資料讀入到一個數組中,然後再參與運算。在C語言中可以利用fscanf( )函式從檔案中讀取資料, 示例如下: void main() {      double **x,*y;       FILE *fp;       if((fp=fo

不要對動態分配的陣列使用memset

一位師兄以前說,現在網際網路上的各種教程都是相互拷貝,一堆垃圾,根本沒有寫的必要。我想想覺得也很有道理。 如果你只是記錄下一個軟體的安裝過程,那還不如去看官方文件。但是如果你加上遇到的坑以及解決辦法,那麼這或許是一篇有意義的文章。如果你只是記錄下一個函式簡單用法,那怎麼不去看官方

C#泛型列表List實現陣列的功能(令附C#泛型列表List基本用法總結)

          // 搜尋有很多種方式,可以使用IndexOf LastIndexOf FindIndex FindLasIndex Find FindLas ,如果只是檢視元素存不,可以使用Exists()方法          // IndexOf() 方法 需要將一個物件做引數, 如果打到,就返回本