我使用动态分配和函数将二维矩阵相乘。为什么地址变了?

问题描述 投票:0回答:1

代码是使用

the column of A and the row of B must be the same
的属性构建的,以找到矩阵乘积。

当我在不使用动态分配的情况下乘以二维矩阵时它起作用了,但是在使用带有函数的动态分配后它不起作用。于是我查了一下地址,地址相差了

30
.

int *matrixMulti(int N, int M, int L, int *A, int *B)
{

  int *Mat = (int *)malloc(N * L * sizeof(int));

  for (int i = 0; i < N; i++)
  {
    for (int j = 0; j < L; j++)
    {
      *(Mat + i * M + j) = 0;
      for (int k = 0; k < M; k++)
      {
        *(Mat + i * M + j) += A[i * M + k] * B[k * M + j];
      }
      printf("Mat[%d][%d] Mat[i][j] %d Mat address : %p \n", i, j, *(Mat + i * M + j), Mat);
      printf("\n");
    }
  }

  return Mat;
}


int main()
{
  int N, M, L;
  printf("input N M L\n      ");
  scanf("%d %d %d", &N, &M, &L);

  int *A = (int *)malloc(N * M * sizeof(int));
  int *B = (int *)malloc(L * M * sizeof(int));
  int *S = (int *)malloc(N * L * sizeof(int));

  input(N, M, A);
  Array_print(N, M, A);

  input(M, L, B);
  Array_print(M, L, B);

  S = matrixMulti(N, M, L, A, B);

  printf("\n S address %p\n", matrixMulti(N, M, L, A, B)); ////////////////////////// ---> A
  printf("\n S address %p\n", S);                          ////////////////////////// ---> A-30

  // Array_print(N, L, matrixMulti(N, M, L, A, B));

  free(A);
  free(B);
  free(S);
  return 0;
}

一开始只传接收

arrays
的时候,矩阵乘法也正常输出,但是改成
pointers
就奇怪了

输出

S 地址 0x159f04120

S 地址 0x159f040f0

期待

S 地址 0x159f04120

S 地址 0x159f04120

完整代码在这里

c pointers function-pointers dynamic-memory-allocation
1个回答
1
投票

这是 matrixMulti 的简化版本

int *matrixMulti(int N, int M, int L, int *A, int *B)
{

  int *Mat = (int *)malloc(N * L * sizeof(int));

   ////  do stuff

  return Mat;
}

你看到它分配内存并返回指向它的指针。

如果你调用它两次,你会在不同的地址得到两个不同的分配

S = matrixMulti(N, M, L, A, B); // call #1

printf("\n S address %p\n", matrixMulti(N, M, L, A, B));  //call #2

编辑

注意这里

 S = matrixMulti(N, M, L, A, B); // call #1

S 现在包含 matrixMulti 返回的值。即垫

int *matrixMulti(int N, int M, int L, int *A, int *B)
{

  int *Mat = (int *)malloc(N * L * sizeof(int));

   ////  do stuff

  return Mat; <<<< this is what gets loaded into S
}

S 不包含 matrixMulti

的地址
© www.soinside.com 2019 - 2024. All rights reserved.