【发布时间】:2018-07-22 06:21:39
【问题描述】:
我正在尝试实现一个函数,该函数将两个动态矩阵 (AxB) 相乘并返回一个指向动态分配的乘积 (C) 的指针。该函数的参数是:
- 指向矩阵 A 的指针
- a_rows,A 中的行数
- a_cols A 中的列数
- 指向矩阵 B 的指针
- b_cols,B 中的列数
由于产品将具有与 A 相同的行数和与 B 相同的列数,因此使用 a_rows 和 b_cols 来确定要分配的产品的大小。
功能如图:
double** MatrixMultiply(
double** a,
const uint32_t a_rows,
const uint32_t a_cols,
double** b,
const uint32_t b_cols) {
double** c;
c = (double**) calloc(a_rows, sizeof(double**)); //product matrix C has
//matrix A rows and Matrix B cols
for(int32_t i = 0; i < a_rows; i++) {
c[i] = (double*) calloc(b_cols, sizeof(double*));
}
for(uint32_t i = 0; i < a_rows; i++) {
for(uint32_t j = 0; j < b_cols; j++) {
for(uint32_t k = 0; k < a_cols; k++) {
c[i][j] += a[i][k] * b[k][j];
}
}
}
return c;
}
问题是,每当我运行我的程序时,它都会被函数崩溃,因为我认为这是某种分段错误。但是,每当我运行调试器并单步执行每一行时,它都不会显示发生任何错误。
让我感到奇怪的是,当我将“a_rows”和“b_cols”更改为常数(例如,20)时,函数运行正常。什么可能导致这个问题?以及如何解决?任何帮助将不胜感激。
【问题讨论】:
-
你所有的内存分配都被破坏了:你将错误的类型传递给
sizeof,你不应该转换calloc()。 -
你从不初始化
a_rows,b_cols...