二维数组的动态内存分配

申请内存时,首先分配行,再分配列;

void malloc2dArray(int **pArr, int x, int y)
{
    int i;
    pArr = (int **)malloc(x * sizeof(int *));
    if(!pArr)
    {
        printf("动态申请内存失败!\n");
        return NULL;
    }

    for(i = 0; i < x; i ++)
    {
        pArr[i] = (int *)malloc(y * sizeof(int));
        if(!pArr[i])
        {
            printf("动态申请内存失败!\n");
            return NULL;
        }
    }
}

释放内存时,首先释放列,再释放行;

void free2dArray(int **pArr, int x, int y)
{
    int i;
    for(i = 0; i < x; i ++)
    {
        free(pArr[i]);
        pArr[i] = NULL;
    }
    free(pArr);
    pArr = NULL;
} 

但这样做的有个问题是,分配内存是不连续的,当对整块内存操作时会出现问题。

下面的代码分配的内存是连续的

void malloc2dArray2(int **pArr, int x, int y)
{
    int i;
    pArr = (int **)malloc(x * sizeof(int *));
    if(!pArr)
    {
        printf("动态申请内存失败!\n");
        return NULL;
    }

    pArr[0] = (int *)malloc(x * y * sizeof(int));
    if(!pArr[0])
    {
        printf("动态申请内存失败!\n");
        free(pArr);
        return NULL;
    }

    for(i = 0; i < x; i ++)
        pArr[i] = pArr[i-1] + y; // 索引与对应的数据地址关联

    memset(p[0], 0, nHeight * nWidth);//二维数组清零
}

void free2dArray2(int **pArr, int x, int y)
{

    free(pArr[0]);
    pArr[0] = NULL;

    free(pArr);
    pArr = NULL;
} 

参考资料 http://03071344.lofter.com/post/10871e_34cade

时间: 2024-12-17 18:06:55

二维数组的动态内存分配的相关文章

C++二维数组的动态声明

int **a  =  new int* [m]   //分配一个指针数组,将其首地址保存在a中   . for(int i = 0; i < m; i++)   //为指针数组的每个元素分配一个数组 a[i] = new int [n]; 相当于产生了一个二维数组 a[m][n]了 静态声明的数组可以有公式(假设也是m行n列) b[i][j] = b[i*n +j] 这是因为数组b是连续的一片内存,而动态声明的数组任意的a[k]都是一个int*类型,即一个地址,所以只能a[i][j]或者*(*

C语言数组:C语言数组定义、二维数组、动态数组、字符串数组

1.C语言数组的概念 在<更加优美的C语言输出>一节中我们举了一个例子,是输出一个 4×4 的整数矩阵,代码如下: #include <stdio.h> #include <stdlib.h> int main() { int a1=20, a2=345, a3=700, a4=22; int b1=56720, b2=9999, b3=20098, b4=2; int c1=233, c2=205, c3=1, c4=6666; int d1=34, d2=0, d3

JAVASE(八) 数组: 一维数组、二维数组、动态数组、静态数组

1.一维数组 1.1 数组的声明和初始化声明方式: String str[]; //不建议使用 String[] str2; 静态初始化:初始化和赋值同时进行 String[] str = new String[]{“aa”,”bb”} String[] str2 = {“aa”,”bb”} //声明和初始化不可以分开 动态初始化:初始化和赋值分开进行 String[] str = new String[5];//5代表是数组的长度 说明: 无论是静态初始化还是动态初始化,数组一旦创建成功,数组

未解决问题:指针作参数、二重指针、指针数组、动态内存分配

题目:输入m个学生n门课的成绩,计算每个学生的平均成绩,输入学生编号后输出该学生各门课的成绩. 先直接上源码:(有错误的源码) #include <stdio.h> #include <stdlib.h> #include <stdbool.h> int **pointer_counterpart = NULL; int main() { void Input_number(int *m, int *n); //输入m个学生n门课成绩 void allocation(i

指针做参数的动态内存分配与二重指针(上)

C中的动态内存分配问题: 格式:Int *pointer; Pointer = (int *)malloc(100 * sizeof(int)); 可以在被调用函数(该函数返回指针的函数)中动态分配内存,(并且该内存是分配在堆内存中的,故而被调函数可以返回指向该堆内存的指针),然后返回该指针值,该指针指向动态分配的内存,然后可以在主函数中free掉pointer.哪怕在主函数中将该指针值赋值给pointer_2,free掉pointer_2也是可以的,(可以理解的,它们都指向该堆内存),以避免出

一维和二维数组 动态内存分配

一维数组的动态内存分配 #include "stdafx.h" #include <iostream> using namespace std; int main() { int length,i; int *p; cin>>length; p=new int[length]; for(i=0;i<length;i++) { p[i]=i; //不要写成*p[i]=i; cout<<p[i]<<endl; //不要写成cout<

C++二维数组动态内存分配

对于二维数组和二维指针的内存的分配 这里首选说一下一维指针和一维数组的内存分配情况. 一维: 数组:形如int  a[5];这里定义了一个一维数组a,并且数组的元素个数是5,这里的a是这五个元素的整体表示,也就是通过a我们能找到这五个元素.注意:a是代表数组第一个元素的首地址.&a是代表数组的地址,虽然它们的值相同. 指针: int *p = NULL:这里p是一个指针,它指向的是计算 机内一块存储int类型的内存.P = a;就是让p等于刚才申请的数组的第一个元素的地址.所以通过p我们也能找到

二、动态内存分配与使用

1.malloc (1)malloc分配函数:需要给出申请空间大小(以字节为单位) (2)返回值是一个首地址,用指针接收 (3)使用sizeof计算元素大小 (4)使用malloc函数申请内存空间,用完后需要释放,否则会造成内存泄露 (5)释放函数free需要指向分配内存的指针 (6)基本形式:void *malloc(unsigned int size); (7)分配指定大小的内存空间,但是不会把分配的空间清0 (8)free(指针);//释放堆空间,标记删除,不清楚内容 (9)示例: ①ma

C++ 动态内存分配(6种情况,好几个例子)

1.堆内存分配 : C/C++定义了4个内存区间: 代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念: 通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间.这种内存分配称为静态存储分配: 有些操作对象只在程序运行时才能确定,这样编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分