我决定用纯 C 语言构建一个库来处理各种矩阵计算是一个很好的挑战。现在,尽管我对 Objective-C 和 Cocoa 有一些很好的经验,但我对 C 的了解正是我所需要的与 Objective-C 一起工作,仅此而已。因此,例如,我熟悉 C 中指针、数组等的概念,但不熟悉 malloc 和 free(ARC 是一种幸福!)。我决定接受这个项目,这样我就可以获得更多的 C 经验(当然,除了有很多乐趣之外!)。
到目前为止,我有一个这样定义的矩阵:
typedef float mReal;
typedef struct {
mReal **v;
int w;
int h;
} matrix;
当然,我还需要一种方法来获得我想要的大小的全新矩阵:
void new_matrix(matrix *m, int w, int h) {
m = malloc(sizeof(matrix));
m->w = w;
m->h = h;
m->v = malloc(w * sizeof *(m->v));
for (int i = 0; i < w; i++) {
m->v[i] = malloc(h * sizeof *(m->v[i]));
}
}
在我的
main()
函数,我决定尝试一下我的新方法:int main()
{
matrix m;
new_matrix(&m, 5, 5);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
m.v[i][j] = i*j;
}
}
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
printf("%f", m.v[i][j]);
}
}
}
现在,您可能已经通过查看代码(或没有)已经猜到了,但是当我尝试将某些内容写入矩阵时,这会崩溃,更具体地说,在这一行:
m.v[i][j] = i*j;
在我理解问题的失败尝试中,我将前两个嵌套的 for 循环从
main()
移出。至 new_matrix()
, 并在 malloc'ing 后直接写入。那奏效了。所以我想问题一定是因为矩阵在一个函数中被 malloc'ed 并在另一个函数中改变了?
最佳答案
你的问题在这里:
new_matrix(&m,
您已经为堆栈上的矩阵分配了空间,并将其地址传递给
new_matrix
.然后 new_matrix 分配一个新的:
m = malloc(sizeof(matrix));
那个新结构永远不会逃脱
new_matrix
.要么让 new_matrix 返回一个指向矩阵的指针,
matrix * new_matrix(int w, int h) { ... }
或者让 new_matrix 对
m
进行操作通过了。
关于c - 指向二维数组和手动内存管理的指针 - C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20412318/