我想以双精度存储数字,但是它正在打印垃圾值。我尝试将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/