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

c語言定義動態二維數組

發布時間: 2022-04-27 09:19:55

『壹』 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))。

(1)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語言中如何不用2級指針實現定義一個動態二維數組,該數組的行和列都要動態定義

兩種方法:
1.轉化為一維數組申請
2.先申請全部行首指針,再按行逐行申請

1.
a=(int *)malloc(sizeof(int),(unsigned)m*n);
使用的時候就和一般的二維數組一樣。
舉個例子給你:
#include "stdlib.h"
#include "stdio.h"
#include <malloc.h>

int main()
{
int i,j;
int n;//這個就是需要指定的行數
int (*p)[10];

scanf("%d",&n);//取得行數

//動態生成二維數組,指定列數為10,如果想改,自己該裡面
的參數,如果想定義n行2列就為: p=(int (*)[2])malloc(n*2*sizeof(int));
p=(int (*)[10])malloc(n*10*sizeof(int)); //動態申請n行10列的二維數組

for(i=0;i<n;i++)
for(j=0;j<10;j++)
p[i][j]=i*j;

for(i=0;i<n;i++)
{
for(j=0;j<10;j++)
printf("%d,",p[i][j]);

printf("\n");
}
free(p);

return 0;
}

2.
這個也給你舉個例子吧:
#include <stdio.h>
#include <malloc.h>
main()
{
int i = 0;
int j = 0;
int line = 0;
int row = 0;
int **p = NULL;

printf("input the line of the array:\n");
scanf("%d", &line);
printf("input the row of the array:\n");
scanf("%d", &row);

p = (int **)malloc(sizeof(int *) * line);
if (NULL == p)
{
return;
}
for (i = 0; i < line; i++)
{
*(p + i) = (int *)malloc(sizeof(int) * row);
if (NULL == *(p + i))
{
return;
}
}
/*input data*/
for (i = 0; i < line; i++)
{
for(j = 0; j < row; j++)
{
p[i][j] = i + 1;
}
}
/*output data*/
for (i = 0; i < line; i++)
{
for(j = 0; j < row; j++)
{
printf("%d", p[i][j]);
}
}
/*free every line point*/
for (i = 0; i < line; i++)
{
free(*(p + i));
p[i] = NULL;
}

free(p);
p = NULL;
}

第一種方法數組創建和釋放都比較簡單

『叄』 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語言 動態構造 二維數組

你的空間申請有問題,這是幫你改好後的,你可以運行看看。不著調是否幫上你了,如果OK還望採納,和而後~~ #include <stdio.h>
#include <stdlib.h>void main()
{
int n,i=0,j=0;
int **p;
printf("?????????:");
scanf("%d",&n);
//p=(int**)malloc(sizeof(int)*n*n);
p=(int**)malloc(sizeof(int*)*n);
for(i=0;i<n;i++)
{
p[i]=(int*)malloc(sizeof(int)*n);for(j=0;j<n;j++)
{
scanf("%d",&p[i][j]);
//printf("%d",p[i][j]);
}
}for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",p[i][j]);
}
printf("\n");
}
system("pause");
}

『伍』 C語言 如何動態創建二維數組

這樣的方法可行,不過要是題目要求輸入m和n,然後再定義二維數組a[m][n],那就行不通了。
你可以這樣做:(以int型為例)
int **a;
int m,n,i;

scanf("%d%d",&m,&n);

a=(int**)malloc(m*sizeof(int*)); /*malloc函數在stdlib.h裡面,用的時候加入這個頭文件*/
for(i=0;i<m;i++)
a[i]=(int*)malloc(n*sizeof(int));

/*這樣以後你就可以把a當作二維數組a[m][n]來用了。。

『陸』 C語言定義動態定義二維數組,求助問題是出在哪編譯無錯,運行時內存報錯. 列印的是2n+1階的幻方矩陣.

組數據的起始地址,第二維就是某組數據中的某個值.其次,你要知道a[][4]所表達的意思,是指二維數組a的每一維都是由4個元素組成的一維數組.而編譯器可以根據你賦給a的初值個數計算它的第一維長度(元素總個數/4,如果不能整除,則長度加1,此時還應該有幾個沒有賦初值的數組元素).而a[3][]的意思從表面上看可以成立,但問題是編譯器不能直接識別其第二維的確切長度(你可以考慮,如果總的初值個數為2時,可以認為a的第二維長度為1,也可以是2,.......),這樣就會產生錯誤.所以,可以a[][4]=這樣定義,而不能定義a[3][]=。
對於你補充的問題,其實我已經講了.因為賦初值是5個元素,所以5/4=1,但除不盡,所以要加1,即實際數組a實質上定義為a[2][4],其內元素為:
1 2 3 4
5 0 0 0 (後面的三個0是系統默認值)
希望對你有所幫助.^-^

『柒』 c語言 動態二維數組

int fun(int m,int n)
{

a=(int**)malloc(m*sizeof(int*));
if(a==NULL) return -1;

for(i=0;i<n;i++)
{
a[i]=(int*)malloc(n*sizeof(int));
if(a[i]==NULL) return -1;
}
}
上面的代碼來看,明顯是誤筆了!
for(i=0; i<n; i++) --> for(i=0; i<m; i++)

這樣才是對的,因為a的元素個數你申請的是m個,而不是n個。這樣的代碼,在n<=m的情況下運行是不會出錯了,當n>m時,那麼就有許多你不可預料的事情發生了!
希望可以幫到你。

『捌』 在C語言中,怎樣定義一個動態的二維數組

auto 數組類型 數組名[數組長度]
例如:auto int a[3]

還有呢,不加auto 默認就是動態的 如果你要加的話

『玖』 C語言怎麼定義動態二維數組

#include <stdio.h> #include "stdlib.h" void main() { int **a,m1,n1; int i; printf("輸入行數列數:"); scanf("%d%d",&m1,&n1); //建立 a=(int **)calloc(m1,sizeof(int)); for(i=0;i<m1;i++) a[i]=(int *)calloc(n1,sizeof(int)); }

『拾』 C語言中如何定義動態二維數組並輸出

intmain()

{

int**p;//定義二維指針。

intm,n;//行數和列數。

inti,j;

scanf("%d%d",&m,&n);//輸入行數和列數。

if(m<=0||n<=0)return-1;//行數或列數非法。

p=(int**)malloc(sizeof(int*)*m);//申請一組一維指針空間。

for(i=0;i<m;i++)

p[i]=(int*)malloc(sizeof(int)*n);//對於每個一維指針,申請一行數據的空間。

for(i=0;i<m;i++)

for(j=0;j<n;j++)

scanf("%d",&p[i][j]);//輸入第i行第j列的數據。其中&p[i][j]也可以寫作p[i]+j或者是*(p+i)+j.功能相同。

printf("輸入的數組為%d行%d列: ",m,n);

for(i=0;i<m;i++)

{

for(j=0;j<n;j++)//這個循環可以輸出一行元素。

printf("%d",p[i][j]);//輸出i行j列的元素。

printf(" ");//每行輸入結束加換行符。

}

//釋放內存

for(i=0;i<m;i++)

free(p[i]);

free(p);


return0;

}

(10)c語言定義動態二維數組擴展閱讀

c語言中通過函數傳遞二維數組

#include

void func(int n, int a[][size])

{

/* access array */

a[i][j];

}

void main()

{

int a[10][10];

func(10, a);

}

熱點內容
安卓微信淺色模式怎麼恢復 發布:2025-05-16 06:27:53 瀏覽:239
美嘉演算法口訣 發布:2025-05-16 06:03:15 瀏覽:952
c程序編譯連接 發布:2025-05-16 06:02:36 瀏覽:964
腳本魔獸 發布:2025-05-16 06:01:52 瀏覽:330
文件夾python 發布:2025-05-16 06:01:43 瀏覽:627
電腦我的世界伺服器游戲幣 發布:2025-05-16 05:27:25 瀏覽:489
索尼手機為什麼不能用安卓10 發布:2025-05-16 05:18:46 瀏覽:784
蔚來es6選擇哪些配置實用 發布:2025-05-16 05:18:05 瀏覽:130
小米如何掃碼wifi密碼 發布:2025-05-16 05:13:38 瀏覽:807
樓層密碼是什麼意思 發布:2025-05-16 05:13:37 瀏覽:13