2017-02-04 7 views
0

Я хочу хранить номера с двойной точностью, но это печать значений мусора. Я попытался изменить malloc на calloc, даже тогда у меня появились значения мусора. Может ли кто-нибудь объяснить, почему это происходит?Значение мусора с 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

Кроме того, я слышал, что значения возврата металока-отливки не являются хорошей идеей в C. – synchronizer

+4

[не бросать malloc] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – Barmar

ответ

1

В дополнение к комментариям, есть несколько вопросов, связанных с проверки что будет кусать вас, если вы не проверить. В первую очередь вы сталкиваетесь с двумя такими проблемами в своем коде (которые применяются каждый раз, когда вы это делаете).

(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 

удачи с вашим кодирования. Дайте мне знать, если у вас возникнут дополнительные вопросы.

Смежные вопросы