我想以双精度存储数字,但它是打印垃圾值。我尝试将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");
}
}
答案 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
祝你的编码好运。如果您还有其他问题,请与我们联系。