malloc的垃圾值

时间:2017-02-04 00:11:34

标签: c malloc garbage

我想以双精度存储数字,但它是打印垃圾值。我尝试将malloc更改为calloc,即使这样我也获得了垃圾值。任何人都可以解释为什么会这样吗?

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

int main() {
    double **mat1;
    int i,j,k,size;

    printf("Enter the matrix size");
    scanf("%d",&size);

    mat1 = (double**)malloc(size*sizeof(double*));
    for(i=0;i<size;i++)
        mat1[i]=(double*)malloc(size*sizeof(double));

    if(mat1 != NULL) {
        // Enter the input matrix
        printf("\nEnter the elements of matrix\n");
        for(i=0;i<size;i++){
            for(j=0;j<size;j++)
                scanf("%d",&mat1[i][j]);
        }

        //Printing Input Matrix
        printf("\n Entered Matrix 1: \n");
        for(i=0;i<size;i++){
            for(j=0;j<size;j++)
                printf("%d ",mat1[i][j]);
        }
    }
    else {
        printf("error");
    }
}

1 个答案:

答案 0 :(得分:1)

除了评论之外,还有一些与验证相关的问题会在您检查失败时咬你。主要是您在代码中遇到两个这样的问题(每次执行时都适用)。

(1)始终验证每个分配。正如@AnT所指出的,检查if(mat1 != NULL)已经太晚了。您必须检查每个分配。 e.g。

/* allocate & VALIDATE */
if (!(mat1 = malloc (size * sizeof *mat1))) {
    fprintf (stderr, "error: virtual memory exhausted.\n");
    return 1;
}

for (i = 0; i < size; i++)  /* allocate & VALIDATE */
    if (!(mat1[i] = malloc (size * sizeof **mat1))) {
        fprintf (stderr, "error: virtual memory exhausted.\n");
        return 1;
    }

(2)始终验证所有用户输入。 (据你所知,有一只猫踩在键盘上)。这也是一项简单的任务:

/* Enter the input matrix */
printf ("\nEnter the elements of matrix\n");
for (i = 0; i < size; i++) {
    for (j = 0; j < size; j++)
        if (scanf ("%lf", &mat1[i][j]) != 1) {  /* VALIDATE */
            fprintf (stderr, "error: invalid conversion.\n");
            return 1;
        }
}

如果遵循这两条规则,您的调试时间将大大缩短。 (更不用说你的代码会很健壮)。

如果您分配内存,请不要忘记free。可以肯定的是,在这段小代码中,内存在退出时被释放。但是当你开始编写分配内存的函数时,如果你还没有跟踪和释放你的分配的习惯,你只是在寻找麻烦。

最后,你总是可以在你的打印循环中抛出一个putchar ('\n')来整理一下。 e.g。

/* Printing Input Matrix */
printf ("\n Entered Matrix 1: \n");
for (i = 0; i < size; i++) {
    for (j = 0; j < size; j++)
        printf (" %6.2lf", mat1[i][j]);
    putchar ('\n');
}

示例使用/输出

$ ./bin/matrixdbg
Enter the matrix size: 2

Enter the elements of matrix
1.1
2.2
3.3
4.4

 Entered Matrix 1:
   1.10   2.20
   3.30   4.40

祝你的编码好运。如果您还有其他问题,请与我们联系。