2016-10-16 3 views
-2

나는 두 가지처음에는 쓰레기 값이 인쇄되는 이유는 무엇입니까?

  1. 는, 0 ~ 10 사이의 숫자를 (값이 10 미만이어야하므로 (10)는 포함되지 않음) 얻을 구분 및 배열

    에 저장 할 것이다 프로그램을 쓰고 있어요
  2. 인쇄이를 위해 각 번호

배열은 I 정확하게 변수로 표시라고 현재 정수 값의 크기에 따라 배열마다 초기화 것이다 IF-다른 블록 쓴 num

하나의 숫자의 배열을 만들면 하나의 요소의 배열을 만들지 만 숫자가 두 자리 길이이면 두 요소 등의 배열이 만들어집니다.하지만 코드를 실행할 때마다 처음에는 쓰레기 값이 인쇄됩니다.

그 이유는 무엇이며이 문제를 해결하는 방법은 무엇일까요?

enter image description here

#include<stdio.h> 
#include<stdlib.h> 
#include<math.h> 
int mirror(int *arr,int num,int i); 
int main(){ 

    int num = 0; 
    int range = 1; 
    int *arr; 
    while(num<10){ 
     int i=0; 
     if(num<(int)pow(10,range)){ 

      arr=(int *)malloc(range*sizeof(int)); 
     }else{ 
      range+=1; 
      arr=(int *)malloc(range*sizeof(int)); 
     } 

     mirror(arr,num,i); 
     for(i=range-1;i>=0;i--){ 
      printf("%d ",arr[i]); 
     } 
     printf("\n"); 
     num++; 
    } 

} 

int mirror(int *arr,int num,int i){ 

    if(num == 0){ 
     return 0; 
    } 
    arr[i] = num%10; 
    mirror(arr,num/10,++i); 

} 
+4

끔찍한 기억이 새고 있습니다. 그리고 그것은 당신의 이상한 가치로 이끌 수 있습니다; 새 배열을 제대로 초기화하지 못할 수 있습니다. 일반적으로, 당신은'else' 문에서'realloc()'을 사용할 것입니다. –

+0

realloc을 사용하면 동일한 출력을 얻을 수 있습니다. ( –

+0

그래, 메모리 누수가 발생했는데 코드에 무슨 문제가 있는지 잘 모르겠다. (아직) –

답변

4

당신이 거울 기능의 기본 케이스에 아무것도 arr[i]을 설정하지 않을 때문입니다. 함수의 반환 값을 전혀 사용하지 않으면 왜 반환할까요?
void으로 만들거나 값을 반환하려면 모든 컨트롤 경로가 일부 값을 반환하는지 확인하십시오. @JonathanLeffler에 의해 아래의 코멘트에 제안으로

:

void mirror(int *arr,int num,int i){ 
    arr[i] = num % 10; 
    if (num >= 10) 
     mirror(arr, num/10, ++i); 
} 

그리고 당신은 무섭게 메모리가 누수하고 있습니다. 각 반복마다 free 메모리를 사용하거나 realloc을 사용하고 프로그램 끝에 free 메모리를 사용하십시오.

+0

젠장, 저를 때려 부치기 –

+1

왜 문제에 대한 해결책을 찾아야할까요? 솔루션에 대해 사소한 생각을합니다 - 반환 값은 사용되지 않으며 함수는 'void'일 수 있습니다. . 단순히 당신이 할 수있는 :'arr [i] = num % 10; if (num> = 10) mirror (arr, num/10, ++ i); 대신 –

+0

num <10이지만 num <103 미러 함수에서 num이 0 일 때 배열에 여분의 값을 추가하기 때문에 오류가 발생합니다. –

관련 문제