这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#define M 5
#define N 3
double **create_matrix(int m, int n);
void destroy_matrix(double **matrix, int m);
int main(void)
{
int i = 0, j = 0;
int x = 0;
double **matrix;
matrix = create_matrix(M, N);
while (i < M) {
j = 0;
while (j < N) {
printf("%4.0f", *(*(matrix + j) + i) = j);
j++;
}
putchar('\n');
i++;
}
destroy_matrix(matrix, M);
return 0;
}
double **create_matrix(int m, int n)
{
int i = 0;
double **matrix;
if ((matrix = (double **) malloc(sizeof(double *) * m)) != NULL) {
while (i < m)
if ((*(matrix + i++) = (double *) malloc(sizeof(double) * n)) == NULL)
return NULL;
return matrix;
} else
return NULL;
}
void destroy_matrix(double **matrix, int m)
{
int i = 0;
while (i < m)
free((void *) *(matrix + i++));
free((void *) matrix);
}
回溯:
*** glibc detected *** [file]: free(): invalid next size (fast): 0x0000000001e7d040 ***
后面是记忆图。
我搜索了类似的问题,但找不到适合我的情况,也不能从中得到我的。
答案 0 :(得分:1)
您的矩阵分配和释放功能对我来说很好。 但矩阵元素的初始化有一个错误:
while (i < M) {
j = 0;
while (j < N) {
printf("%4.0f", *(*(matrix + j) + i) = j);
j++;
}
putchar('\n');
i++;
}
此表达式
*(*(matrix + j) + i)
*(*(matrix + i) + j)
因为i
是您的行,而j
是您的列。
请注意,您还可以使用更简单的格式matrix[i][j]
,该格式相当于程序中的*(*(matrix + i) + j)
。
答案 1 :(得分:0)
您正在释放取消引用,即数组内容指向的地址。试试这个。注意第6行'(matrix + i ++)之前缺少'*'
void destroy_matrix(double **matrix, int m)
{
int i = 0;
while (i < m)
free((void *) (matrix + i++));
free((void *) matrix);
}