如何在C中实现矩阵函数

时间:2018-04-23 18:16:32

标签: c matrix

我正在尝试制作一些简单的函数,对矩阵进行一些操作。但我不能理解为什么以下代码不起作用!你能帮我理解这里有什么问题吗?我该怎么办?

void create(int*** p, const int n)
{
    *p = (int**)calloc(n, sizeof(int));
    if(*p == NULL){
        printf("Error1");
    }

    int i;
    for(i = 0; i < n; i++){
        (*(p[i]) = (int*)calloc(n, sizeof(int)));

        if(*(p[i]) == NULL){
            printf("Error2");
        }
    }
}
void initializeMatrix(int*** p, const int n)
{
    int i, j;

    for(i = 0; i < n; i++){
        for(j = 0; j < n; j++){
            scanf("%d", &((p[i][j])));
        }
    }
}
void show(const int** p, const int n)
{
    int i, j;
    for(i = 0; i < n; i++){
        for(j = 0; j < n; j++){
            printf("%d ", ((p)[i][j]));
        }
        printf("\n");
    }
}
int main()
{
    int** p = NULL;

    create(&p, 2);
initializeMatrix(&p, 2);

    show(p, 2);

    return 0;
}

1 个答案:

答案 0 :(得分:2)

问题1

您在*(p[i])中使用create。它应该是(*p)[i]

void create(int*** p, const int n)
{
    *p = (int**)calloc(n, sizeof(int));
    if(*p == NULL){
        printf("Error1");
    }

    int i;
    for(i = 0; i < n; i++){

        // FIXED 
        (*p)[i] = (int*)calloc(n, sizeof(int)));

        // FIXED
        if( (*p)[i] == NULL){
            printf("Error2");
        }
    }
}

问题2

您将错误的大小传递给函数中的第一个calloc。您需要使用sizeof(int*)。毕竟,您希望返回的值是指向n的{​​{1}}指针的指针,而不是指向int类型n对象的指针。

这是导致未定义行为的严重错误,除非int与您平台上的sizeof(int)相同。

将行更改为

sizeof(int*)

更重要的是,通过返回指针可以使该功能更容易一些。编写这样的函数会更容易。

    *p = (int**)calloc(n, sizeof(int*));

并将其用作:

int** create(int n)
    int **p = calloc(n, sizeof(*p));
    if(p == NULL){
        printf("Error1");
    }

    int i;
    for(i = 0; i < n; i++){

        p[i] = calloc(n, sizeof(*p[i])));

        if( p[i] == NULL){
            printf("Error2");
        }
    }

    return p;
}