C 矩阵幂和指针

C 矩阵幂和指针,c,pointers,matrix,multidimensional-array,C,Pointers,Matrix,Multidimensional Array,我试图用乘法计算矩阵A的幂。 我对ArrayPower函数有问题。它的功能并不像我认为的那样。不过,多数组函数似乎工作得很好。有人能帮我吗 #include <stdio.h> int** MultiArray(int a[2][2],int b[2][2]); int** ArrayPower(int a[2][2],int e); int main(void) { int fa[2][2]; fa[0][0]=0; fa[0][1]=1;

我试图用乘法计算矩阵A的幂。 我对ArrayPower函数有问题。它的功能并不像我认为的那样。不过,多数组函数似乎工作得很好。有人能帮我吗

#include <stdio.h>

int**  MultiArray(int a[2][2],int b[2][2]);
int**  ArrayPower(int a[2][2],int e);


int main(void)
{
    int fa[2][2];
    fa[0][0]=0;
    fa[0][1]=1;
    fa[1][0]=1;
    fa[1][1]=1;

    int **multifa=malloc(sizeof(int)*2);
    for (int i=0;i<2;i++) {
        multifa[i]=malloc(sizeof(int)*2);
    }

    multifa=ArrayPower(fa,2);

   printf("%d %d\n",multifa[0][0],multifa[0][1]);
   printf("%d %d\n",multifa[1][0],multifa[1][1]);

    return 0;

}

int**  MultiArray(int a[2][2], int b[2][2]) {

    //multi a *b
    //memory allocation
    int i,rows=2,cols=2;
    int **c=malloc(rows*sizeof(int));
    for (i=0;i<rows;i++) {
        c[i]=malloc(cols*sizeof(int));
    }


    c[0][0]=a[0][0]*b[0][0]+a[0][1]*b[1][0];
    c[0][1]=a[0][0]*b[0][1]+a[0][1]*b[1][1];

    c[1][0]=a[1][0]*b[0][0]+a[1][1]*b[1][0];
    c[1][1]=a[1][0]*b[0][1]+a[1][1]*b[1][1];


    return c;

}

int** ArrayPower(int a[2][2],int e) {


    //memory allocation
    int i,rows=2,cols=2;
    int **c=malloc(rows*sizeof(int));
    for (i=0;i<rows;i++) {
        c[i]=malloc(cols*sizeof(int));
    }

  c[0][0]=a[0][0];
  c[0][1]=a[0][1];
  c[1][0]=a[1][0];
  c[1][1]=a[1][1];

   for (i=1;i<e;i++) {
       c=MultiArray(a,c);
   }
   return c;

}
#包括
int**MultiArray(inta[2][2],intb[2][2]);
内部**阵列电源(内部a[2][2],内部e);
内部主(空)
{
int fa[2][2];
fa[0][0]=0;
fa[0][1]=1;
fa[1][0]=1;
fa[1][1]=1;
int**multiva=malloc(sizeof(int)*2);

for(int i=0;i
MultiArray
声明为使用类型为
int[2][2]
的第二个参数,但调用它时使用的参数为
c
,该参数为类型为
int**
。这些类型不兼容

在参数中,类型
int[2][2]
自动转换为指向两个
int
数组的指针,类型
int(*)[2]
。这是指向两个
int
对象所在位置的指针(而且,因为我们知道它是由两个
int
对象组成的两个数组的第一个元素,所以我们知道在前两个对象之外还有两个
int
对象)

带有
int**c
c
的定义意味着
c
是指向
int
的指针。指向指针的指针和指向数组的指针不同且不兼容

解决此问题的一种方法是使用
int(*c)[2]=malloc(2*sizeof*c);
定义
c
。这样就不需要在定义之后有循环来分配更多空间;单个分配分配分配整个数组

MultiArray
的返回类型以及其中的代码和程序中的其他地方都应该进行类似的更改。或者,
MultiArray
的第二个参数可以从
int b[2][2]
更改为
int**b
。(后者更容易编辑,但生成的程序较差,因为它使用的指针和分配比需要的多。)


您应该始终在编译代码时启用警告。这会提醒您错误的调用。

为什么要为
multifa
分配内存?您这样做的方式是,在调用ArrayPower()后失去对已分配内存的引用并且会泄漏内存。你说得对!这是不必要的。谢谢你的帮助!