memory - 使用 1 个 malloc 调用为二维矩阵分配内存

标签 memory runtime malloc free

We can allocate memory for 2d matrix using 1 malloc call as
int (*a)[5];
int i,j;

a=malloc(sizeof(int*) * 5);//分配5个指针 每个指针指向 5 个整数的数组

我们如何释放分配成功的内存? 使用 free(a) 会产生运行时错误

使用 对于(我=0;我<5;我++) 免费(a[i]);

免费(一);

这也会导致运行时错误

最佳答案

编辑:整个故事。

以前我忽略了三种 其他分配二维数组的方法。

动态二维数组方法一:

如果您在编译时知道列数,则此方法有效。

#define CCOLS 200

int (*m)[CCOLS] = malloc(cRows * sizeof(*m));
m[iRow][iCol] = n; // sets the item at iRow*CCOLS + iCol

...

free(m);

之所以可行,是因为 m 被声明为指向 CCOLS 整数数组的指针。编译器知道它的大小并为您计算。 m[iRow] = CCOLS 整数数组。

您只能将此传递给具有此签名的函数:

foo(int (*m)[CCOLS]) { ... }

也许这个签名,取决于你的编译器和你使用的开关:

foo(int m[][CCOLS]) { ... }

不是这个签名:

foo(int **m) { ... }

由于内存布局和大小不同。

int m[][CCOLS] 看起来像这样:

+---------+---------+---------+---------+     
| m[0][0] | m[0][1] | m[0][2] | m[0][3] |     
+---------+---------+---------+---------+     
| m[1][0] | m[1][1] | m[1][2] | m[1][3] |     
+---------+---------+---------+---------+     
| m[2][0] | m[2][1] | m[2][2] | m[2][3] |     
+---------+---------+---------+---------+     
| m[3][0] | m[3][1] | m[3][2] | m[3][3] |     
+---------+---------+---------+---------+     

int **m 看起来像这样:

+----+        +----+----+----+----+----+      
|m[0]|  --->  |    |    |    |    |    |      
+----+        +----+----+----+----+----+      
|m[1]|  --->  |    |    |    |    |    |      
+----+        +----+----+----+----+----+      
|m[2]|  --->  |    |    |    |    |    |      
+----+        +----+----+----+----+----+      
|m[3]|  --->  |    |    |    |    |    |      
+----+        +----+----+----+----+----+      

动态二维数组方法2(C99,并非所有编译器都支持):

这一个与上一个相同,但您不需要在编译时知道维度。

int cCols, cRows, iCol, iRow;
... set cRows, cCols somehow, they could be passed in as parameters also ...
int (*m)[cCols] = malloc(cRows * sizeof(*m));
m[iRow][iCol] = n; // sets the item at iRow*cCols + iCol

...

free(m);

您只能将此传递给具有此签名的函数:

foo(int cCols, m[][cCols])  {}

或者这个

foo(int cRows, int cCols, m[cRows][cCols])  {}

如果你使用gcc,这里更多info .

使用STACK的动态二维数组方法3! (并非所有编译器都支持 C99):

如果您对堆栈上的 2d 数组没有问题,这可以让您完全避免 malloc。

int cRows, cCols;
... set cRows, cCols somehow ...
int m[cRows][cCols];
m[iRow][iCol] = n; 

我假设您也可以用这种方式声明一个全局变量。

以与方法 2 相同的方式将其传递给函数。

动态二维数组法4:

这是很多人使用的指针数组方法。

您使用一个 malloc 进行分配以提高效率。当然,您只能免费使用一个。只有当你有巨大的数组,其中连续的内存变成并发出时,你才想单独分配每一行。

int cCols = 10, cRows = 100, iRow;

// allocate:
// cCols*cRows*sizeof(int) = space for the data
// cRows*sizeof(int*) = space for the row ptrs
int **m = malloc(cCols*cRows*sizeof(int) + cRows*sizeof(int*));

// Now wire up the row pointers.  They take the first cRows*sizeof(int*) 
// part of the mem becasue that is what m[row] expects.
// we want each row pointer to have its own cCols sized array of ints.
// We will use the space after the row pointers for this.
// One way to calc where the space after the row pointers lies is to
// take the address of the nth + 1 element: &m[cRows].
// To get a row ptr, cast &m[cRows] as an int*, and add iRow*cCols to that.
for (iRow = 0; iRow < cRows; ++iRow)
    m[iRow] = (int*)&m[cRows] + iRow*cCols; 

// or 
for (p=(int*)&m[cRows] ; iRow = 0; iRow < cRows; ++iRow, p+=cCols)
    m[iRow] = p; 


// use it:
...
m[iRow][iCol] = 10;
...

// free it
free(m);

关于memory - 使用 1 个 malloc 调用为二维矩阵分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10624981/

相关文章:

Android:在 onDraw 上创建位图

c++ - 我们可以使用 'malloced' 释放 'delete' 内存吗?

javascript - "-"在 chrome 内存 devtool 的距离字段中意味着什么

memory - Octave:稀疏矩阵上的 std 内存消耗太大

java - 关于 java : get `String[].class` from `String.class` , 如果 `String.class` 是 "runtime type"怎么办?

c - C 中的运行时错误

java - 流量控制异常

c - 将字符串添加到字符串数组会以某种方式更改数组中的先前字符串

c - 我在函数中分配内存,并返回 char*,我应该如何释放它?

c - 为什么我在 main 函数中添加任何语句时我的 C 程序会崩溃?