c - 在C中创建动态二维数组
问题描述
我想编写一个计算矩阵乘法的程序。
但是,似乎内存分配存在问题。对于 m <= 2 和 n <= 2,代码工作得很好,但是在盯着它看了一个小时后,我仍然无法弄清楚为什么程序会炸毁比这更大的 vor 值(SegFault 和 free_matrix() 抱怨关于尝试释放未分配的内存)。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
typedef double *Vector;
typedef Vector *Matrix;
//Initializes a matrix of given size
Matrix mat_alloc(int m, int n){
Matrix mat = NULL;
mat = (Matrix)malloc(sizeof(m * sizeof(Vector)));
if(mat == NULL){
printf("Error: Not Enough Memory!\n");
return NULL;
}
for(int i = 0; i < m; i++){
mat[i] = (Vector)malloc(n * sizeof(double));
if(mat[i] == NULL){
printf("Error: Not Enough Memory!\n");
return NULL;
}
}
return mat;
}
Matrix mat_mult(Matrix A, Matrix B, int m, int n, int k){
Matrix C = mat_alloc(m, k);
for(int i = 0; i < m; i++){
for(int j = 0; j < k; j++){
C[i][j] = 0;
for(int l = 0; l < n; l++){
C[i][j] += A[i][l] * B[l][j];
}
}
}
return C;
}
void print_matrix(Matrix mat, int m, int n){
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
printf("%.2lf ", mat[i][j]);
}
printf("\n");
}
}
void read_matrix(Matrix mat, int m, int n){
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
printf("(%d,%d) = ", i+1, j+1);
scanf("%lf", &mat[i][j]);
}
}
}
void free_matrix(Matrix mat, int m){
for(int i = 0; i < m; i++){
free(mat[i]);
}
free(mat);
}
int main(int argc, char *argv[]){
int m = 0;
int n = 0;
int k = 0;
printf("Dimensions of A (m x n):\n");
printf("m = ");
scanf("%d", &m);
printf("n = ");
scanf("%d", &n);
printf("Dimensions of B (n = %d x k):\n", n);
printf("k = ");
scanf("%d", &k);
printf("Your input: m = %d, n = %d, k = %d\n", m, n, k);
Matrix A = NULL;
Matrix B = NULL;
Matrix C = NULL;
A = mat_alloc(m, n);
B = mat_alloc(n, k);
printf("Enter Values for A!\n");
read_matrix(A, m, n);
printf("Enter Values for B!\n");
read_matrix(B, n, k);
printf("A = \n");
print_matrix(A, m, n);
printf("\nB = \n");
print_matrix(B, n, k);
C = mat_mult(A, B, n, m, k);
printf("\nC = \n");
print_matrix(C, m, k);
free_matrix(A, m);
free_matrix(B, n);
free_matrix(C, m);
return 0;
}
先感谢您。
解决方案
这里:
mat = (Matrix)malloc(sizeof(m * sizeof(Vector)));
应该
mat = (Matrix)malloc(m * sizeof(Vector));
或者更好
mat = malloc(sizeof *mat * m);
您的 asizeof
太多了,因此您没有获得所需的指针数组大小,而是获得了一个常量( a 的大小size_t
)。
推荐阅读
- javascript - linking button to required html using django python
- django - 是否可以将一个视图中定义的类的实例传递给Django中的另一个视图
- javascript - TypeError: nameList.map is not a function 通过使用 antd validateFields() 和 getFieldValue 获取值 null
- python - Pandas 数据框连接和排序索引
- flutter - 如何在卡片内添加标签栏?
- json - 我想在我的主页通知图标中将数组长度显示为计数。我该怎么做?
- excel - 如何更快地突出显示单元格?
- typescript - 为什么 Typescript 更喜欢“import * from X”?
- ios - 如何在滚动时旋转集合视图单元格
- opencv - 如何解决 OpenCv 跟踪器的遮挡对象问题以及如何改进快速运动对象的跟踪?