當前位置:首頁 » 編程語言 » 動態分配二維數組c語言

動態分配二維數組c語言

發布時間: 2024-05-31 08:29:37

c語言中二維數組如何申請動態分配內存

1、使用malloc函數,先分配第一維的大小,然後再循環分配每一維的大小。

2、常式,分配3行4列二維數組:

#include<stdio.h>
#include<malloc.h>
intmain()
{
int**a;
inti,j;
a=(int**)malloc(sizeof(int*)*3);//為二維數組分配3行
for(i=0;i<3;++i){//為每列分配4個大小空間
a[i]=(int*)malloc(sizeof(int)*4);
}
//初始化
for(i=0;i<3;++i){
for(j=0;j<4;++j){
a[i][j]=i+j;
}
}
//輸出測試
for(i=0;i<3;++i){
for(j=0;j<4;++j){
printf("%d",a[i][j]);
}
printf(" ");
}
//釋放動態開辟的空間
for(i=0;i<3;++i){
free(a[i]);
}
free(a);
return0;
}
/*
輸出:
0123
1234
2345
*/

❷ C璇璦濡備綍鍦ㄥ瓙鍑芥暟涓瀵逛富鍑芥暟涓鐨勪簩緇存暟緇勫艱繘琛屼慨鏀癸紵 浜岀淮鏁扮粍宸茬粡鍦ㄤ富鍑芥暟涓鐢ㄥ姩鎬佹暟緇勫垎閰嶄簡絀洪棿銆

鐢ㄦ寚閽堝仛鍑芥暟鍙傛暟鍙浠ュ疄鐜幫紒

❸ C語言如何動態分配二維數組

動態分配二維數組:

void main(int argc, char * argv[])

{

int NC=100, NR=200;

int i,j;

char **a; // a[NR][NC] -- *a[NR] -- a[j][i]

a = (char **) malloc(sizeof(char *) * NR);

for (j=0;j<NR;j++){

a[j] = (char *) malloc(sizeof(char) * NC);

}

// 釋放空間: free(a);

編譯錯誤是因為p[j]=(char *)malloc,而不是題目的(char *)malloc(n*sizeof(char))。

(3)動態分配二維數組c語言擴展閱讀:

二維數組的動態分配

二維數組A[m][n],這是一個m行,n列的二維數組。設a[p][q]為A的第一個元素,即二維數組的行下標從p到m+p,列下標從q到n+q,按「行優先順序」存儲時則元素a[i][j]的地址計算為:

LOC(a[i][j]) = LOC(a[p][q]) + ((i − p) * n + (j − q)) * t

按「列優先順序」存儲時,地址計算為:

LOC(a[i][j]) = LOC(a[p][q]) + ((j − q) * m + (i − p)) * t

存放該數組至少需要的單元數為(m-p+1) * (n-q+1) * t 個位元組。

❹ C語言-二維數組動態分配

pArray2=(int**)malloc(sizeof(int*[3])); //分配了3個int*的空間,32地址環境下指針的長度都是32位的也就是4位元組,那3個int*就是12位元組,和3個int長度是一樣的,湊巧而已
也可以寫成這樣:
pArray2=(int**)malloc(3*sizeof(int*)); //分配3個int*的空間
現在pArray2指向的有效空間內包含3個指針,這3個指針是int*,也就是指向int的指針,這3個指針的值是隨機的,還不能用,先要讓它們指向合適的空間才行
於是就有:
for(....)
*(pArray2+i)=(int*)malloc(sizeof(int[3])); //這就是給pArray2指向的空間內的3個指針校正方向,讓每一個指針指向由3個int整數組成的數組的首地址,這才是最終的數據空間
和pArray2一樣,也可以寫成:
*(pArray2+i)=(int*)malloc(3*sizeof(int)); //3個int

❺ c語言如何動態創建二維數組

既然是動態創建,那麼,所創建的二維數組的行、列數應該具有「普適」性,即,應由「用戶」確定二維數組的規模。這是有難度的。因為,二維數組要牽扯行指針,且需要固定每行的列元素個數,用這種思路就沒有辦法達到「普適」。
為此,必須清醒地知道,所謂二維數組,其元素在內存中依然是以一維的方式存放的。說實話,二維數組本質上是不存在的。
既然如此,那麼,「構造」一個所謂的二維數組,只要能提供足夠實用的函數(工具)操作這個二維數組就可以了。
綜上,接受由用戶決定的二維數組行、列值,申請一個一維數組的空間,按照二維數組方式進行定位和操作就可以了。
為簡便起見,我用如下定義,你可以更改裡面的類型,以適應自己的需要:
typedef int USER_TYPE;

// 定義一個控制二維數組(矩陣)的「控制頭」,由三個成員組成

typedef struct MATRIX
{
USER_TYPE *data; // 真正用來存儲二維數組元素的空間

int Row; // 二維數組行數

int Col; // 二維數組列數

}MATRIX;

MATRIX *initMatrix(int row, int col); // 初始化二維數組

USER_TYPE getElementAt(MATRIX matrix, int i, int j); // 取得指定下標的元素

void setElementAt(MATRIX matrix, int i, int j, USER_TYPE val); // 給指定下標的元素賦值
void destroyMatrix(MATRIX *matrix); // 銷毀二維數組

void destroyMatrix(MATRIX *matrix)
{
free(matrix->data);
free(matrix);

}

void setElementAt(MATRIX matrix, int i, int j, USER_TYPE val)
{
matrix.data[i*matrix + j] = val;

}

USER_TYPE getElementAt(MATRIX matrix, int i, int j)
{
return matrix.data[i*matrix.Col + j];

}

MATRIX *initMatrix(int row, int col)
{
MATRIX *mp;

mp = (MATRIX *)malloc(sizeof(MATRX));
mp->data = (USER_TYPE *)malloc(sizeof(USER_TYPE) * row * col);
mp->Row = row;
mp->Col = col;

return mp;

}
把上面的函數當成工具,完成二維數組初始化、賦值、取值等一系列操作,如果需要比較,還需要編寫比較的函數。

❻ c璇璦 杈撳叆涓涓猰*n鏁村艦鐨勪簩緇存暟緇,瀵瑰叾姣忚屾眰鍜,鍜屽崟鐙瀛樻斁鍦ㄤ竴涓涓緇存暟緇勪腑錛

m,n 杈撳叆鍚庯紝鍔ㄦ佸垎閰 2緇存暟緇 a, 鍜屽瓨鏀 姣忚屽拰 鐨 1緇存暟緇 b.
鐒跺悗杈撳叆 m*n涓 鏁村艦鏁版嵁錛屾渶鍚庤緭鍑 姣忚屽拰銆
#include <stdio.h>
int main(){
int **a; // a[m][n] or a[NR][NC]
int *b;
int NR,NC;
int i,j;
printf("input number of rows m:\n");
scanf("%d",&NR);
printf("input number of cols n:\n");
scanf("%d",&NC);
a = (int **) malloc(sizeof(int *) * NR);
for (j=0;j<NR;j++){
a[j] = (int *) malloc(sizeof(int) * NC);
}
b = (int *) malloc(sizeof(int *) * NR);
printf("input 2-d array data, %d rows %d colums:\n",NR,NC);
for (j=0;j<NR;j++) for (i=0;i<NC;i++) scanf("%d",&a[j][i]);
for (j=0;j<NR;j++){
b[j]=0;
for (i=0;i<NC;i++) b[j]=b[j]+a[j][i];
}
printf("sum of each line:\n");
for (j=0;j<NR;j++) printf("%d ",b[j]);
return 0;
}
渚嬪傦細
input number of rows m: 3
input number of cols n: 4
input 2-d array data, 3 rows 4 colums:
1 2 3 4
5 6 7 8
9 10 11 12
sum of each line:
10 26 42

❼ c語言:怎樣用malloc函數動態分配二維數組,使之可輸入數組的行數和每行的列數。

這個是可以的,但是和其他網友說的一樣,內存是線性的,當你在語言中分配一個多維數組的時候,編譯器其實也是分配線性內存的,但是我們可以通過模擬來實現類似數組的操作,下面演示一個分配以及操作數組的實例(列數要固定,這里假設列數為4):
int _tmain(int argc, _TCHAR* argv[])
{
int (*p)[4] = (int (*)[4])0;
int row = 3;
int (*mem)[4] = (int (*)[4])0; // 定義數組首指針
mem = (int (*)[4])malloc(sizeof(int(*)[4]) * row); // 分配row行, 4列的數組
// 分別為二維數組的第一維各個元素賦值。
mem[0][0] = 1;
mem[0][1] = 2;
mem[0][2] = 3;
mem[0][3] = 4;
// 列印二維數組的各個元素的值
printf("%d, %d, %d, %d", mem[0][0], mem[0][1], mem[0][2], mem[0][3]);
free(mem);
return 0;
}

不過這里列數必須指定,還有一種方法,這種方法可以保證用戶輸入任意行或列,而不必要將列數定死,演示如下:

int getElement(int* arr, int colNum, int row, int col);
void setElement(int* arr, int colNum, int row, int col, int val);

int _tmain(int argc, _TCHAR* argv[])
{
int *arr = (int*)0;
int row = 3;
int col = 5;
//分配 row 行 col 列的整形數組
arr = (int*)malloc(sizeof(int) * col * row);
// 將最後一個元素值設置為100
setElement(arr, col, 2, 4, 100);
//輸出最後一個元素的值
printf("%d", getElement(arr, col, 2, 4));
free(arr);
return 0;
}
//各個參數說明如下:
//arr: 數組首地址
//colNum:數組列數
//row: 要取得的元素所在行
//col: 要取得的元素所在列
int getElement(int* arr, int colNum, int row, int col)
{
return *(arr + sizeof(int) * (row - 1) * colNum + col);
}

// 此函數用來設置指定行和列的元素的值:
//arr: 數組首地址
//colNum:數組列數
//row: 要取得的元素所在行
//col: 要取得的元素所在列
//val: 要設置的值
void setElement(int* arr, int colNum, int row, int col, int val)
{
*(arr + sizeof(int) * (row - 1) * colNum + col) = val;
}

其實歸根到底,還是對指針的操作,希望可以幫到你,呵呵。

熱點內容
sql2005加密 發布:2024-11-27 08:32:11 瀏覽:740
安卓手機如何鎖屏錄像 發布:2024-11-27 08:31:14 瀏覽:98
wms源碼 發布:2024-11-27 08:30:25 瀏覽:3
華為編譯器系列 發布:2024-11-27 08:29:42 瀏覽:854
長江存儲上海 發布:2024-11-27 08:29:31 瀏覽:328
crm客戶管理系統源碼 發布:2024-11-27 07:59:26 瀏覽:363
匠辰app安卓在哪裡下載 發布:2024-11-27 07:47:12 瀏覽:731
sql表操作 發布:2024-11-27 07:46:31 瀏覽:813
雲頂之腳本 發布:2024-11-27 07:45:37 瀏覽:658
編程箴言pdf 發布:2024-11-27 07:43:59 瀏覽:369