c - 指向二维数组和手动内存管理的指针 - C

标签 c arrays matrix multidimensional-array

我决定用纯 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/

相关文章:

r - 用项目共存频率构建一个稀疏矩阵(用于分析产品的交叉销售)

c - 使用 OpenGL 着色器语言编写一个简单的着色器

c - AVR RTOS 的内联 C 汇编器宏

c++ - "int *a[5]"和 int(*a)[5]” 有什么区别?

java - java中对子数组进行反向排序

r - cor() 函数的完整.obs

c - Apache 服务器中的全局变量

c - 如何将 pgm_read_byte 宏 (AVR-GCC) 移植到 Mircrochip C18 编译器?

arrays - Swift Array 弱持有元素

c - '错误: expected expression before '{' token' - matrix as member of struct