二维数组动态分配总结

今天老师布置了一道矩阵转置,果然啊,耍了一个暑假都忘得差不多了,还是古语说得好:“好记性不如烂笔头”;废话不多说了,小白要开始总结了。

方法一:数组空间不连续,两次调用malloc

int ** array_1(int row, int col)
{
    int i;
    int **p; 

    p =(int **) malloc(row * sizeof(int *));
    if (p == NULL)
        return NULL;

    for (i = 0; i < row; i++)
        p[i] =(int*) malloc(sizeof(int) * col);

    return p;
}
方法二:数组空间连续,且只调用malloc一次,相对方法一效率要高

int ** array_2(int row, int col)
{
    int i;
    int *p, **pp;
    p = (int*)malloc(row * col * sizeof(int));
    pp = (int**)malloc(row * sizeof(int *));
    if (p == NULL || pp == NULL)
        return NULL;

    //pp = &p;
    for (i = 0; i < row; i++)
        pp[i] = p + col * i;

    return pp;
}
ps:一开始程序里有pp=&p的时候,程序一直报错。后来在论坛请教后才知道,此时的pp已经不再指向原本分配的空间了。。。。。。

注意:

 if (p == NULL || pp == NULL)//应该分开判断,当p分配成功而pp分配失败时,应该free(p),避免内存泄漏





方法三(分配连续内存,列确定):

#include<stdio.h>
#include<stdlib.h>

int main()
{
	const int MAXCOL=3;
	int nRow;
	printf("请输入二维数组的行数(列固定为%d):",MAXCOL);
	scanf("%d",&nRow);
	int *p=new int[nRow*MAXCOL];//连续内存
	int (*pp)[MAXCOL]=(int(*)[MAXCOL])p;//将p转换为二维数组,int(*pp)[MAXCOL]为p分配空间
	int i,j;
	for(i=0;i<nRow;i++)
	{
		for(j=0;j<MAXCOL;j++)
		{
			pp[i][j]=i+j;
		}
	}
	for(i=0;i<nRow;i++)
	{
		for(j=0;j<MAXCOL;j++)
		{
			printf("%5d",pp[i][j]);
		}
		putchar('\n');
	}
	delete [] p;//在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。
	system("pause");
	return 0;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值