二维数组动态分配总结

来源:互联网 发布:c语言中memcpy 编辑:程序博客网 时间:2024/04/29 06:14

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

方法一:数组空间不连续,两次调用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