尝试用C实现动态大小矩阵。错误在哪里?
我在实现动态矩阵时遇到了一些问题。 理论上,我必须做的事情似乎很清楚,我已经在这个网站(以及其他资源)上读到了一些类似的问题。尽管如此,以下非常简单的代码不起作用。 你介意建议如何发现错误吗尝试用C实现动态大小矩阵。错误在哪里?,c,C,我在实现动态矩阵时遇到了一些问题。 理论上,我必须做的事情似乎很清楚,我已经在这个网站(以及其他资源)上读到了一些类似的问题。尽管如此,以下非常简单的代码不起作用。 你介意建议如何发现错误吗 #include <stdio.h> #include <stdlib.h> int main() { int dim1 = 10; // #Rows int dim2 = 4; // #Columns int i; int j; d
#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;
}
#包括
#包括
int main(){
int dim1=10;//#行
int dim2=4;//#列
int i;
int j;
双**mtrx=(双**)malloc(尺寸(双**)*dim1);
//mtrx是我的动态矩阵,大小为dim1*dim2//
对于(i=0;i
我的代码的目的如下。
首先,声明大小为dim1*dim2的动态矩阵(即“dim1”行和“dim2”列)。
然后,在第(1)阶段,按照简单模式(mtrx[i][j]=i)初始化每个元素。
请注意,这里有一个“超出”printf指令:我添加它是为了“调试”目的,以确保初始化过程的正确性(这似乎工作正常)。
然后,在第2阶段,我展示了结果,最后我释放了使用的内存
问题是:
- 阶段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);
(i=0;i
mtrx[i]=malloc(双倍尺寸)*dim2;
您正在为数组分配指针数组。C99允许您通过以下方式一步分配具有运行时大小的2D阵列:
double (*mtrx)[dim2] = malloc(sizeof(double) * dim1 * dim2);
如果dim1
和dim2
不是太大,您甚至可以将mtrx
定义为具有自动存储的本地2D阵列:
double mtrx[dim1][dim2];
你需要一个现代的C编译器来实现这一点,
gcc
或clang
,微软自己的C编译器已经过时,不支持C99功能,这是15年前标准化的。幸运的是,gcc
和clang
在Windows操作系统的不同端口中可用。在第一个malloc
中,您需要使用sizeof(double*)
和第二个sizeof(double)
。祝你好运。天哪,你说得对!非常感谢
double mtrx[dim1][dim2];