c语言:怎样用malloc函数动态分配二维数组,使之可输入数组的行数和每行的列数。
5个回答
展开全部
这个是可以的,但是和其他网友说的一样,内存是线性的,当你在语言中分配一个多维数组的时候,编译器其实也是分配线性内存的,但是我们可以通过模拟来实现类似数组的操作,下面演示一个分配以及操作数组的实例(列数要固定,这里假设列数为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;
}
其实归根到底,还是对指针的操作,希望可以帮到你,呵呵。
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;
}
其实归根到底,还是对指针的操作,希望可以帮到你,呵呵。
来自:求助得到的回答
展开全部
我推荐塌渗用以为数组来存储二维数裤中组的数:
for (i=0;i<n;i++)
for(j=0;j<团纯脊m;j++)
{
arry[i*n+j];
}
for (i=0;i<n;i++)
for(j=0;j<团纯脊m;j++)
{
arry[i*n+j];
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
假设我需要一个nrows、ncolumns数组,则可以用以下几种方法动态分配空间:辩咐
1.动态数组的成员都可以用正常的数组下带念标 Array[i][j]
#include <stdio.h>
#include <stdlib.h>
void main()
{
int nrows,ncolumns;
int **Array;
int i,j;
printf("please input nrows&ncolumns:\n");
scanf("%d%d",&nrows,&ncolumns);
Array=(int **)malloc(nrows*sizeof(int *));
for(i=0;i<ncolumns;i++)
Array[i]=(int *)malloc(sizeof(*Array));
for(i=0;i<nrows;i++)
{
for(j=0;j<ncolumns;j++)
{
Array[i][j]=1;
printf("%d ",Array[i][j]); //动态数组的成员都可以用正常的数组下标 arrayx[i][j]
}
printf("\n");
}
free(Array);
}
2.让数组的内容连续, 但在后来重新分配列的时候会比较困难, 得使用一点指针算术:
#include <stdio.h>
#include <stdlib.h>
void main()
{
int nrows,ncolumns;
int **Array;
int i,j;
printf("please input nrows&ncolumns:\n");
scanf("%d%d",&nrows,&ncolumns);
Array=(int **)malloc(nrows*sizeof(int *));
Array[0]=(int *)malloc(nrows*ncolumns*sizeof(int));
for(i=1;i<nrows;i++)
Array[i]=Array[0]+i*ncolumns;
for(i=0;i<nrows;i++)
{
for(j=0;j<ncolumns;j++)
{
Array[i][j]=1;
printf("%d ",Array[i][j]); //动态蠢灶困数组的成员都可以用正常的数组下标 arrayx[i][j]
}
printf("\n");
}
free(Array);
}
3.同一个单独的动态分配的一维数组来模拟二维数组:
#include <stdio.h>
#include <stdlib.h>
void main()
{
int nrows,ncolumns;
int *Array;
int i,j;
printf("please input nrows&ncolumns:\n");
scanf("%d%d",&nrows,&ncolumns);
Array=(int *)malloc(nrows*ncolumns*sizeof(int *));
for(i=0;i<nrows;i++)
{
for(j=0;j<ncolumns;j++)
{
Array[i*nrows+j]=1;
printf("%d ",Array[i*nrows+j]); //用 array3[i * ncolumns + j] 访问第 i, j 个成员
}
printf("\n");
}
free(Array);
}
1.动态数组的成员都可以用正常的数组下带念标 Array[i][j]
#include <stdio.h>
#include <stdlib.h>
void main()
{
int nrows,ncolumns;
int **Array;
int i,j;
printf("please input nrows&ncolumns:\n");
scanf("%d%d",&nrows,&ncolumns);
Array=(int **)malloc(nrows*sizeof(int *));
for(i=0;i<ncolumns;i++)
Array[i]=(int *)malloc(sizeof(*Array));
for(i=0;i<nrows;i++)
{
for(j=0;j<ncolumns;j++)
{
Array[i][j]=1;
printf("%d ",Array[i][j]); //动态数组的成员都可以用正常的数组下标 arrayx[i][j]
}
printf("\n");
}
free(Array);
}
2.让数组的内容连续, 但在后来重新分配列的时候会比较困难, 得使用一点指针算术:
#include <stdio.h>
#include <stdlib.h>
void main()
{
int nrows,ncolumns;
int **Array;
int i,j;
printf("please input nrows&ncolumns:\n");
scanf("%d%d",&nrows,&ncolumns);
Array=(int **)malloc(nrows*sizeof(int *));
Array[0]=(int *)malloc(nrows*ncolumns*sizeof(int));
for(i=1;i<nrows;i++)
Array[i]=Array[0]+i*ncolumns;
for(i=0;i<nrows;i++)
{
for(j=0;j<ncolumns;j++)
{
Array[i][j]=1;
printf("%d ",Array[i][j]); //动态蠢灶困数组的成员都可以用正常的数组下标 arrayx[i][j]
}
printf("\n");
}
free(Array);
}
3.同一个单独的动态分配的一维数组来模拟二维数组:
#include <stdio.h>
#include <stdlib.h>
void main()
{
int nrows,ncolumns;
int *Array;
int i,j;
printf("please input nrows&ncolumns:\n");
scanf("%d%d",&nrows,&ncolumns);
Array=(int *)malloc(nrows*ncolumns*sizeof(int *));
for(i=0;i<nrows;i++)
{
for(j=0;j<ncolumns;j++)
{
Array[i*nrows+j]=1;
printf("%d ",Array[i*nrows+j]); //用 array3[i * ncolumns + j] 访问第 i, j 个成员
}
printf("\n");
}
free(Array);
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这位 刘刘1234561 的代码问题很多;
虽然问题很多,但我们普遍的操作方式类似于他所说的第三种方式,因为内存是线性的拿弯,只有偏移位置和长度的概念,所以我们只能分配出来一维线性内存,但我们可以利用代码,将其在逻辑层面作为二维甚至多维数组来操作,这里,你可以关注一下数组与指针的区别,总之,找到你要操作的数据存并敏扰放的位置(相对于你分配内存首地址的偏移位置)你就可以操作他,抛弃那些所谓的一维数组,二维数组,他们不是主角。
数据就是地址,地址还是数绝旦据;数据,数据,都是数据。
虽然问题很多,但我们普遍的操作方式类似于他所说的第三种方式,因为内存是线性的拿弯,只有偏移位置和长度的概念,所以我们只能分配出来一维线性内存,但我们可以利用代码,将其在逻辑层面作为二维甚至多维数组来操作,这里,你可以关注一下数组与指针的区别,总之,找到你要操作的数据存并敏扰放的位置(相对于你分配内存首地址的偏移位置)你就可以操作他,抛弃那些所谓的一维数组,二维数组,他们不是主角。
数据就是地址,地址还是数绝旦据;数据,数据,都是数据。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
My answer is wrong , I am so sorry...
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询