Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试用C实现动态大小矩阵。错误在哪里?_C - Fatal编程技术网

尝试用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未“正确”显示结果
  • 在自由阶段,我得到一个错误,如
***自由():下一个大小无效(快速)

我的怀疑:我可能错误地声明了矩阵的内存,导致了一些数据溢出和与“free”指令不兼容,但不幸的是,我没有找到错误


我提前感谢你的帮助

需要在这两个地方更改内存分配,其他代码似乎都很好


当您有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];