我在实施动态矩阵方面遇到了一些麻烦。 从理论上讲,我似乎很清楚我必须做什么,而且我已经在这个网站(以及其他资源)上阅读了一些类似的问题。虽然,以下非常简单的代码不起作用。 你介意如何找出错误吗?
#include <stdio.h>
#include <stdlib.h>
int main() {
int dim1 = 10; // #Rows
int dim2 = 4; // #Columns
int i;
int j;
double **mtrx = (double **)malloc(sizeof(double **) * dim1);
// mtrx is my dynamic matrix, of size dim1*dim2 //
for (i = 0; i < dim1; ++i)
mtrx[i]= (double *)malloc(sizeof(double *) * dim2);
// (1) Inizialize//
for (i = 0; i < dim1; ++i) {
printf("(%d):\t", i);
for (j = 0; j < dim2; ++j) {
mtrx[i][j] = i;
printf("mtrx[%d][%d] = %.f ", i, j, mtrx[i][j]);
}
printf("\n");
}
// (2) Show the results//
printf("\nShow the results:\n");
for (i = 0; i < dim1; ++i) {
printf("(%d):\t", i);
for (j = 0; j < dim2; ++j)
printf("mtrx[%d][%d] = %.f ", i, j, mtrx[i][j]);
printf("\n");
}
// (3) Free the memory
printf("\n***free the memory***\n");
for (i = 0; i < dim1; ++i )
free(mtrx[i]);
free(mtrx);
return 0;
}
我的代码的目的如下。 首先,声明一个大小为dim1 * dim2的动态矩阵(即&#34; dim1&#34;行和&#34; dim2&#34;列)。 比,阶段(1),按照简单模式(mtrx [i] [j] = i)初始化每个元素。 请注意,这里有超过&#34;超过&#34; printf说明:我为&#34;调试&#34;添加了它。目的,在奥德,以确保初始化过程的正确性(这似乎正常)。 然后,阶段2,我显示结果,最后我释放使用的内存。
问题是:
*** free():下一个尺寸无效(快)......
我怀疑:我可能错误地为我的矩阵声明了内存,导致数据溢出并且与&#34; free&#34;不兼容。指导,但不幸的是我没有设法找到错误。
我事先感谢你的帮助!!!
答案 0 :(得分:3)
您正在为数组分配一个指针数组。 C99允许您以这种方式一步分配具有运行时大小的2D数组:
double (*mtrx)[dim2] = malloc(sizeof(double) * dim1 * dim2);
如果dim1
和dim2
不是太大,您甚至可以将mtrx
定义为具有自动存储的本地2D数组:
double mtrx[dim1][dim2];
你需要一个现代的C编译器,gcc
或clang
,微软自己的C编译器已经过时,并且不支持15年前标准化的C99功能。幸运的是,gcc
和clang
可用于Windows操作系统的不同端口。
答案 1 :(得分:2)
当你有malloc时,参数是你想要分配的大小(字节)。所以如果你只想要一张桌子,你必须写
(sizeof(type of the table) * the_number_of_cells_you_want);
您应该首先分配sizeof(double*) * dim1
。然后在循环中:
for ( i = 0; i < dim1; ++i)
mtrx[i]= malloc ( sizeof ( double ) * dim2);
答案 2 :(得分:1)
需要更改内存分配,其他代码似乎都很好don't cast the result of malloc。
double ** mtrx = malloc ( sizeof (double *) * dim1);
mtrx[i]= malloc ( sizeof ( double ) * dim2);