2017-02-04 11 views
0

倍精度で数値を格納したいが、ガベージ値を出力している。私はcallocにmallocを変更しようとしましたが、それでもゴミ値を得ました。なぜこれが起こっているのか誰も説明できますか?mallocでのガベージ値

#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"); 
    } 
} 
+10

'scanf'と' printf'に間違った指定子を使用しています。 '%d'は符号付き整数を対象としています。'%g'を試してください。 – Jack

+2

また、mallocの戻り値をキャストするのは良い考えではありません。 C. – synchronizer

+4

[mallocをキャストしない](http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – Barmar

答えて

1

は、コメントに加えて、あなたがチェックするために失敗した場合、あなたをかむ検証に関連する問題がいくつかあります。主に、コードで2つの問題が発生しています(コードを実行するたびに適用されます)。

(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; 
     } 
} 

この2つのルールに従うと、デバッグ時間が大幅に短縮されます。 (あなたのコードは堅牢であるはずはありません)。

メモリを割り当てる場合は、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 

あなたのコーディングで頑張ってください。さらに質問がある場合はお知らせください。

関連する問題