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))。
(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);
}