c语言malloc二维数组
㈠ 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的二维数组报错如何解决
把double **u = (double **)malloc(sizeof(sizeof(double*)*ROW));改为double **u = (double **)malloc(sizeof(double*)*ROW);——前者只申请了4个字节,后者才是申请12个字节(3个double *所占空滑嫌间)。
(这里有点复杂了)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弄反了……
代码没有释放所申请的内存也是一错。
㈤ 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的空间
}
}