我想以双精度存储数字,但是它正在打印垃圾值。我尝试将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)始终验证每个分配。正如@AnT所指出的,检查if(mat1 != NULL)已经为时已晚。您必须检查每个分配。例如

/* 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')放入打印循环中以整理内容。例如

/* 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


祝您编码顺利。如果您还有其他问题,请告诉我。

关于c - 使用malloc的垃圾值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42034997/

10-11 16:35