自由矩阵的动态矩阵问题

时间:2013-11-21 19:22:35

标签: c

我正在尝试从用户输入中读取矩阵维度(dim)并动态创建n*n矩阵。 但是当我打印矩阵时,我的程序崩溃了。

我在Stackoverflow中搜索,可能是free()错误。 我不知道为什么,但程序在dim < 5时有用。

        #include <stdio.h>
        #include <stdlib.h>

        typedef struct{
            float real, img;
        }COMPLEXO;

        void zeroIt(COMPLEXO **matrix, int dim){
            int i,j;
            for(i=0;i<dim;i++){
                for(j=0;j<dim;j++){
                    matrix[i][j].real=0;
                    matrix[i][j].img=0;
                }
            }
        }

        int main(void){
            int dim, i, j;
            COMPLEXO **matrix;
            int flag = 1;
            /*Pedir Dimensao da Matrix*/
            printf("DIM: \n");
            scanf("%d", &dim);
            /*Alocar espaço*/
            matrix = (COMPLEXO **) malloc(sizeof(dim) * sizeof(COMPLEXO));
            /*Alocar linhas*/
            for(i = 0; i < dim; i++){
                matrix[i] = (COMPLEXO *) malloc(sizeof(dim) * sizeof(COMPLEXO));
            }
            if(matrix == NULL){
                printf("Erro");
                return;
            }

            /* Escrever dados */

            for(i=0;i<dim;i++){
                for(j=0;j<dim;j++){
                    matrix[i][j].real = i;
                    matrix[i][j].img = j;
                }
            }
            printf("#insert matrix - done\n\n");

            /* Imprimir dados */
            for(i=0;i<dim;i++){
                for(j=0;j<dim;j++){
                    printf("%.f|%.f ", matrix[i][j].real, matrix[i][j].img);
                }
                printf("\n");
            }

            printf("#print matrix - done \n\n");
            zeroIt(matrix, dim);
            for(i=0;i<dim;i++){
                free(matrix[i]);
            }
            free(matrix);
            printf("#free pointer - done \n\n");
            getchar();
            return 0;
        }

3 个答案:

答案 0 :(得分:2)

您的第一个malloc应该使用sizeof(COMPLEXO*),而不是sizeof(COMPLEXO)。你正在分配一个指针数组,而不是一个结构数组。

答案 1 :(得分:0)

你应该在malloc调用之后将NULL检查移动到正确的位置,这样你就可以在使用指针之前发现问题...(这不是你的错误,你必须拥有完整的RAM并交换到体验这个):

        matrix = (COMPLEXO **) malloc(sizeof(dim) * sizeof(COMPLEXO));

        if(matrix == NULL){
            printf("Error");
            return;
        }

接下来要检查分配错误是否完成,你应该在for循环中添加check:

        for(i = 0; i < dim; i++){
            matrix[i] = (COMPLEXO *) malloc(sizeof(dim) * sizeof(COMPLEXO));
            if(matrix[i]==NULL)
            {
                printf("Not enough memory");
                return ;
            }
        }

然后你可以使用一些奇怪的大量DIM来测试它,比如2000000000

答案 2 :(得分:0)

简单的家伙,

matrix = (COMPLEXO **) malloc(dim * sizeof(COMPLEXO*));