试图在C中实现动态大小矩阵。错误在哪里?

时间:2015-12-19 10:01:00

标签: c

我在实施动态矩阵方面遇到了一些麻烦。 从理论上讲,我似乎很清楚我必须做什么,而且我已经在这个网站(以及其他资源)上阅读了一些类似的问题。虽然,以下非常简单的代码不起作用。 你介意如何找出错误吗?

#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,我显示结果,最后我释放使用的内存。

问题是:

  • 阶段2未正确显示结果&#34;;
  • 在免费阶段,我得到了一个像
  • 这样的错误
  

*** free():下一个尺寸无效(快)......

我怀疑:我可能错误地为我的矩阵声明了内存,导致数据溢出并且与&#34; free&#34;不兼容。指导,但不幸的是我没有设法找到错误。

我事先感谢你的帮助!!!

3 个答案:

答案 0 :(得分:3)

您正在为数组分配一个指针数组。 C99允许您以这种方式一步分配具有运行时大小的2D数组:

double (*mtrx)[dim2] = malloc(sizeof(double) * dim1 * dim2);

如果dim1dim2不是太大,您甚至可以将mtrx定义为具有自动存储的本地2D数组:

double mtrx[dim1][dim2];

你需要一个现代的C编译器,gccclang,微软自己的C编译器已经过时,并且不支持15年前标准化的C99功能。幸运的是,gccclang可用于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);