今天老师布置了一道矩阵转置,果然啊,耍了一个暑假都忘得差不多了,还是古语说得好:“好记性不如烂笔头”;废话不多说了,小白要开始总结了。
方法一:数组空间不连续,两次调用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;
}