使用三重指针创建矩阵会导致段错误

标签 c pointers matrix

我需要实现一个接收三重指针的 matrix_create 函数。
它编译得很好,但是当我运行它时,我得到了 Segmentation Fault 错误,可能是因为我在内存分配的某个地方搞砸了。
但是我找不到我的错误。

代码

#include <stdio.h>
#include <stdlib.h>

int matrix_create(int ***m, int ze, int sp);
void matrix_init(int **m, int ze, int sp);

int main (void)
{
    int ze = 3;
    int sp = 3;
    int i,j;
    int ***m = malloc(sizeof(int**));
    *m = malloc(ze * sizeof(int*));

    matrix_create(m, ze, sp);
    matrix_init(*m, ze, sp);
    for(i = 0; i < ze; ++i) {
        for(j = 0; j < sp; ++j)
            printf("%i\n", *m[i][j]);
    }
    return 0;
}

int matrix_create(int ***m, int ze, int sp)
{
    int i, k;
    if (!*m)
        return 0;
    for (i = 0; i < ze; ++i) {
        *m[i] = malloc(sp * sizeof(int));
        if (!*m[i]) {
            for (k = 0; k < i; ++k)
                free(*m[k]);
            free(*m);
            return 0;
        }
    }
    return 1;
}

void matrix_init(int **m, int ze, int sp)
{
    int i,j;
    for(i = 0; i < ze; ++i) {
        for(j = 0; j < sp; ++j)
            m[i][j] = rand() % 1000;
    }
}

最佳答案

索引运算符[] 优先于间接运算符*
参见C Operator Precedence .

这意味着你必须改变

*m[i]

(*m)[i]

在函数 matrix_create 中:

(*m)[i] = malloc(sp * sizeof(int));
if (!(*m)[i]) {
    .....
}

在主程序中:

printf("%i\n", (*m)[i][j]);

关于使用三重指针创建矩阵会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48285809/

相关文章:

c - 这有什么问题吗?它一直告诉我: too many arguments for format -wformat-extra-args

发送指针时按引用调用 C

java - 打印二维数组时如何插入 "-"和 "="

c - 数组元素取消引用和寻址 - &buffer[index] - 在 Swift 中有效吗?

c - 如何更改存储在内存地址的值

c++ - 如何计算 Eigen 库中稀疏矩阵的逆

iphone - 使用 Accelerate (CLAPACK) 求解增广矩阵?

c - "multidimensional array pointer +1"的值不匹配

c++ - Linux下捕获SIGKILL的调试程序

c - 是否有支持每个 __attribute__ 的最低 gcc 版本列表?