當前位置:首頁 » 編程語言 » c語言malloc二維數組

c語言malloc二維數組

發布時間: 2023-03-24 19:05:24

c語言用malloc定義二維數組問題

p是一個指向指針的指針,在上例中,你用malloc函數開辟的一段內存賦給了p,簡單的理解,其實p就是一個數組(以下我稱為p數組),不過數組中存放的都是指針,即p是一個指針數組,數組中存放了5個指向int型的指針,你知道一個普通的數組可用它的數組名進行訪問例如:a[5]就可用*a訪問其第一個元素。
同理用*p就可訪問p數組的第一個元素,*p+1訪問第二個元素,以此類推,而*p中存放的又是一個指針,所以**p就可以指向一個整形數據

㈡ 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語言:怎樣用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;
}

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

㈣ C語言使用malloc的二維數組報錯如何解決

  1. 把double **u = (double **)malloc(sizeof(sizeof(double*)*ROW));改為double **u = (double **)malloc(sizeof(double*)*ROW);——前者只申請了4個位元組,後者才是申請12個位元組(3個double *所佔空滑嫌間)。

  2. (這里有點復雜了)u[x][y]中x只能取0、1、2,因為只李襲申請了3個指針;y可能取0、1、2、3、4。但後面有u[4][0]、u[4][1],甚至有u[i+1][0]之類,顯然一維信擾手下標超出2了,造成了越界錯誤。似乎後面你把ROW和COL弄反了……

  3. 代碼沒有釋放所申請的內存也是一錯。

㈤ C語言編程,如何自動生成一個二維數組

程序主要通過malloc函數動態生成數組,srand和rand函數配合生成隨機數據,代碼如下,
//程序功能,實現自定義m*n二維數組,隨機生成給定范圍max-min的數組元素
#include<stdio.h>
#include <stdlib.h>
#include <time.h>

void main()
{
int i=0,j=0;
int m=0,n=0;//數組維數
int max=0,min=0;//數組數據范圍
int **p=NULL;//二維指針,存放m*n個元素
int tmp;
printf("請輸入數組維數m和n:");
scanf("%d %d",&m,&n);
printf("請輸入數組元素最大最小值max和min:");
scanf("%d %d",&max,&min);
if(max<min)//保證max大於min
{
tmp=max;
max=min;
min=max;
}
p=(int**)malloc(m*sizeof(int*));//先分配m個一維指針
if(NULL==p)
exit(1);
for (i = 0; i < n ; i++)
{
p[i] = (int*)malloc(n*sizeof(int));//為m個一維指針分配n個整型大小的空間
if (NULL==p[i])
exit(1);
}
srand(time(NULL));
for(i=0;i<m;i++)
for(j=0;j<n;j++)
p[i][j]=rand()%(max-min+1)+min;
printf("%d*%d二維數組為:\n",m,n);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%d\t",p[i][j]);
printf("\n");
}

for (i = 0; i < n; i++)
{
free(p[i]);
p[i]=NULL;
}
free(p);
p=NULL;
}

void *malloc( size_t size );如果分配成功則返回指向被分配內存的指針,指針指向一個大小為size的內存空間;如果錯誤發生返回NULL。
一般srand和rand配合使用產生偽隨機數序列。rand函數在產生隨機數前,需要系統提供的生成偽隨機數序列的種子,rand根據這個種子的值產生一系列隨機數。如果系統提供的種子沒有變化,每次調用rand函數生成的偽隨機數序列都是一樣的。srand(unsigned seed)通過參數seed改變系統提供的種子值,從而可以使得每次調用rand函數生成的偽隨機數序列不同,從而實現真正意義上的「隨機」。通常可以利用系統時間來改變系統的種子值,即srand(time(NULL)),可以為rand函數提供不同的種子值,進而產生不同的隨機數序列。

㈥ 如何用C語言malloc聲明一個二維數組,比如我想聲明一個 int a(5)(8)

malloc聲槐喊拍明滲運一個二維數組, 假定行數 NR=5, 列數NC=8:
int NR=5,NC=8;
int i,j;
int **a;
// scanf("%d %d", &NR, &NC); 你也可以在這里輸入行數,列數,然後
// 動態分配:
a = (int **) malloc(sizeof(int *) * NR);
for (j=0;j<NR;j++){
a[j] = (int *) malloc(sizeof(int) * NC);
}
// 假定這里賦初值:
for (j=0;j<NR;j++) for (i=0;i<NC;i++) {
a[j][i] = (j+1)*100 + i;
}
//輸出數組元素值:
for (j=0;j<NR;j++){
for (i=0;i<NC;i++) printf("%3d ",a[j][i]);
printf("\n");
}
//釋放內存的方法:
for (j=0;j<鉛羨NR;j++) free(a[j]);
free(a);

㈦ c語言 malloc二維數組

樓主對指針和數組、以及動態內存分配的概念不是很清晰。

structGraphMatrix{	VexType*vexs;/*頂點信息*/
AdjTypearcs[VN][VN];/*關系矩陣*/
};/*VN為圖中頂點個數,具體演算法中替換為具體常數*/
在這個結構定義中,arcs是一個鋒攜數組,在生成GraphMatrix對象是,會為arcs分配VN*VN個AdjType的數據空間銀升伏,所以可以對arcs[i][j]=xxx;對數組元素進行賦值,但不能對arcs=p;這樣的方式進行賦值。

而在main函數中,malloc()返回的是一個void*類型,在把它賦給p之前,需要強制轉換為p的類型(也即是int**)才能賦給p。
注意:int**p;p的類型是指針而非數組!

但這里需要指出的是,main函數中,雖然語法沒有報錯,但實際類型是不匹配的。
首先,int**p表示,p是指向int*的指針,也即是說,*p應該是一個int*類型(指針類型笑巧)。
但是在p=(int**)malloc(sizeof(int)*5);這一個語句中,卻是申請了5個int來作為保存int*的空間。剛在下面的循環申請空間中,可能會出問題:
p[i]=(int*)malloc(sizeof(int)*5);
p[i]的實際malloc出來的類型是int,而不是int*,所以是會悲劇的(如在一個int只有兩位元組,而指針佔4位元組的系統上,空間是不夠的。)
所以這段代碼應該是:
main()
{
int**p,i;
p=(int**)malloc(sizeof(int*)*5);//5個int*的空間
for(i=0;i<5;i++)
{
p[i]=(int*)malloc(sizeof(int)*5);//5個int的空間
}
}
熱點內容
安卓破解游戲app哪個好用貼吧 發布:2024-11-05 02:12:36 瀏覽:145
陡峭的演算法 發布:2024-11-05 02:12:00 瀏覽:752
閑散資金怎麼配置 發布:2024-11-05 02:04:46 瀏覽:922
ftp站點建立 發布:2024-11-05 02:04:45 瀏覽:32
編程音樂解碼 發布:2024-11-05 02:04:05 瀏覽:257
為什麼微信掃碼安卓手機很慢 發布:2024-11-05 01:58:01 瀏覽:534
SLSB演算法 發布:2024-11-05 01:49:44 瀏覽:130
比安卓頭子短一點的是什麼數據線 發布:2024-11-05 01:43:53 瀏覽:534
c語言多選 發布:2024-11-05 01:41:31 瀏覽:302
c語言判斷一個數是否是素數 發布:2024-11-05 01:36:32 瀏覽:833