更新:循环开辟内存时,销毁内存时也需要进行循环销毁,这里进行了代码补充
目录
动态内存更多的知识在这篇博客,本文将介绍用malloc开辟矩阵。
malloc是C语言中用来动态开辟内存的,通过malloc函数可以向计算机申请一串连续的内存空间。
因为malloc开辟的内存在堆上,不会随函数的声明周期结束而销毁,因此当该内存不再使用时,需要用free进行内存释放。
malloc和free使用的基本方式:
malloc开辟二维矩阵的示例:
以函数的形式表达:输入row行,col列,开辟矩阵并返回指针
- double** Make_Matrix(int row,int col)
- {
- int i, j;
- double** arr = (double**)malloc(sizeof(double*) * row);
- if (arr != NULL)
- {
- for (i = 0; i < row; i++)
- {
- arr[i] = (double*)malloc(sizeof(double) * col);
- }
- }
- return arr;
- }
以上代码可以这样理解:
开辟完矩阵后,还不能立即进行计算,还需要对矩阵进行初始化。
矩阵的初始化一般指的是将矩阵全部初始化为0,可以使用内存函数memset。memset只适合矩阵的清零操作,为矩阵每个元素赋值需要for循环遍历。
memset
memset这个函数通常为新申请的内存做初始化工作,作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
void * memset ( void * ptr, int value, size_t num );
- void Init_Matrix(double**arr)
- {
- int i;
- int row= (int)_msize(arr) / (int)sizeof(double*);
- for (i = 0; i < row; i++)
- {
- memset((arr[i]), 0, _msize(*arr));
- }
- }
上述代码中:
传统遍历法
- void Init_Matrix(double** arr)
- {
- int i, j;
- int row = (int)_msize(arr) / (int)sizeof(double*);
- int col = (int)_msize(*arr) / (int)sizeof(double);
- for (i = 0; i < row; i++)
- {
- for (j = 0; j < col; j++)
- {
- arr[i][j] = 0;
- }
- }
- }
因为在创建矩阵时是循环创建的,因此在销毁时依然需要循环销毁,代码如下:
- void free_Matrix(double** src,int row)
- {
- assert(src);
- for(i = 0;i < row; i++)
- {
- free(src[i]);
- }
- }
-