当前位置: 首页 > 知识库问答 >
问题:

使用1malloc调用为2D矩阵分配内存

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

共有1个答案

裘丰
2023-03-14

剪辑:整个故事。

前面我忽略了其他三种分配2D数组的方法。

动态二维数组方法1:

#define CCOLS 200

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

...

free(m);
foo(int (*m)[CCOLS]) { ... }
foo(int m[][CCOLS]) { ... }
foo(int **m) { ... }
+---------+---------+---------+---------+     
| 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]|  --->  |    |    |    |    |    |      
+----+        +----+----+----+----+----+      

动态2D数组方法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])  {}
int cRows, cCols;
... set cRows, cCols somehow ...
int m[cRows][cCols];
m[iRow][iCol] = n; 

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

动态二维数组方法4:

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

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);
 类似资料:
  • 问题内容: 我必须在Java中创建一个2D矩阵(由双精度值组成)以及一个1D向量。应该可以访问单个行和列以及单个元素。此外,它应该是线程安全的(线程同时写入)。也许以后我也需要一些矩阵运算。 哪种数据结构最适合?只是2D数组还是TreeMap?还是有什么很棒的外部库? 问题答案: 您应该将Vector用于2D数组。这是 线程安全的 。 如果这是您的矩阵索引 00 01 10 11 您可以像这样获得

  • 问题内容: 我正在自学一些Java,并且坚持创建2D数组,该数组使用随机值对其进行初始化,然后创建该数组的转置。 示例输出为: 原始矩阵 转置矩阵 ^应该是最终输出。代码的一些帮助将不胜感激! 如果行或列的数量超出指定范围,我想编写代码以生成错误消息。以及是否从命令行读取矩阵元素而不是随机生成它们。 问题答案: 这是返回转置矩阵的int [] []的简单方法… 比起打印二维矩阵,您可以使用如下方法

  • 是否可以将范围分配给矩阵。如果将以下零矩阵视为绘图的“网格”: 你能把这个矩阵当作一个网格,这样每个x轴的零点都可以看作一个范围吗?例如,是一个范围是一个范围等。 范围思想也可以应用于列吗? 这样做的目的是,我可以读取单元阵列数据,我已经组织到零矩阵的范围,以产生一个二维直方图。

  • 给定一个2维正整数数组,求和最大的HxW子矩形。矩形的总和是该矩形中所有元素的总和。 输入:具有正元素的二维数组NxN子矩形的HxW大小 输出:HxW大小的子矩阵,其元素的总和最大。 我已经使用蛮力方法解决了这个问题,但是,我现在正在寻找一个具有更好复杂性的更好的解决方案(我的蛮力法的复杂性是O(n6))。

  • 我正在学习C。我有一个程序,可以动态创建和填充两个矩阵X和Y,使用随机数使用rand(),如下所示 当我运行这个程序并给出2作为我的矩阵的大小时,我看到“分离故障”是错误。请注意,我们的想法是用双精度类型的随机元素填充两个矩阵。如果上面的代码是正确的,请告诉我。 更正:编辑1 以上功能现在正常工作。需要解释x=(double**)malloc(m*sizeof(double*));并且x[i]=(

  • 我使用OpenGL进行2D渲染,并希望使用实际像素坐标。我的意思是,我希望(0,0)位于窗口的左上角,而(宽度,高度)位于窗口右下角(其中宽度和高度是窗口的像素尺寸)。为了做到这一点,我使用了一个投影矩阵,该矩阵由glOrtho生成,然后传递给顶点着色器: 我使用的是LWJGL,它没有glm的绑定,所以我使用上面的OpenGL调用获得2D正交矩阵。我重置了投影矩阵,这样它就不会影响我以后的绘图调用