当前位置:首页 > 内存 > 正文

c语言动态内存分配二维数组

  • 内存
  • 2024-06-02 00:23:19
  • 8350

一、C语言二维数组内存是怎么分配的?二维数组实际上是内存中的平面一维数组,解释如下:
int
arr[3][5]

int
arr[15]
使用的内存区域大小相同,15*sizeof(int)字节。
如果进行如下定义:
union{
int
a[3][5];
int
b[15];
}U;
您会发现
U.a
=
&U.b
U.a[0]
==
&Ub[0]
U.a[1]
==
&U.b[5]
U.a[2]
==
&U.b[10]
&U.a[2][3]
==
&U.b[13]
规则为:
&U.a[m][n]
==
&U.b[m*5+n],其中5是数组a的第二个维度。
事实上,这样的公式在运行时将二维数组转换为对一维数组的访问。
二、c语言:怎样用malloc函数动态分配二维数组,使之可输入数组的行数和每行的列数。这是有可能的,但是正如其他网友所说,内存是线性的,当你在语言中分配多维数组时,编译器实际上是线性分配内存的,但是我们可以通过模拟分配和操作数组来实现类似数组的操作(数组的个数)列数必须是固定的,假设列数为4):
int_tmain(intargc,_TCHAR*argv[])
{
int(*p)[4]=(int(*)[4])0;
introw=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);
return0;
}
但是,这里必须指定列数。该方法可以保证用户输入任意行或列,而不必固定列数/>
intgetElement(int*arr,intcolNum,introw,intcol);
voidsetElement(int*arr,intcolNum,introw,intcol,intval);
int_tmain(intargc,_TCHAR*argv[])
{
int*arr=(int*)0;
introw=3;
intcol=5;
//分配行row列column的整型数组
arr=(int*)malloc(sizeof(int)*col*row);
//设置最后一个元素值为100
setElement(arr,col,2,4,100);
//打印最后一个元素的值
printf("%d",getElement(arr,col,2,4));
free(arr));
return0;
}
//各参数说明如下:
//arr:数组首地址
//colNum:数组列数
//row:要检索元素的行
//col:要检索的元素的列
intgetElement(int*arr,intcolNum,introw,intcol)
{
return*(arr+sizeof(int)*(row-1)*colNum+col);
}
//该函数用于设置指定行列中元素的值:
//arr:数组首地址
//colNum:数组列数
//row:要检索的元素的行
//col:要检索的元素的列
//val:要设置的值
voidsetElement(int*arr,intcolNum,introw,intcol,intval)
{
*(arr+sizeof(int)*(row-1)*colNum+col)=val;
}
其实归根结底还是指针的操作,希望对你有帮助,哈哈。