代码是使用
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
完整代码在这里
这是 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
的地址