我想存储双倍精度的数字,但它正在打印垃圾值。我尝试将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 matrixn");
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 matrixn");
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
祝你的编码好运。如果您还有其他问题,请告诉我。