2012-06-27 5 views
0

메모리에서 정수를 저장하고 출력하는 프로그램을 작성해야합니다. 나는 realloc을 사용해야한다. 기본적으로이 프로그램은 크기를 2 정수로 할당합니다. 입력에 2 int가 주어지면, 1 int에 대한 공간을 재 할당해야하며 double을 출력합니다. 입력 3의 int를 부여 할 때 다음, 그것은 인터넷 용 2 이상의 공백을 할당해야 두 번 .. 등등 출력합니다 .. C 프로그래밍 :이 프로그램에서 realloc은 어떻게 사용합니까?

Test cases: 

input file in.0: 
------ 
4 
------ 

expected output: 
------ 
4 
------ 

================================================= 

input file in.1: 
------ 
4 5 
------ 

expected output: 
------ 
4 
5 
double 
------ 

================================================== 

input file in.2: 
------ 
4 5 3 
------ 

expected output: 
------ 
4 
5 
double 
3 
double 
------ 

=================================================== 

input file in.3: 
------ 
4 5 3 2 9 
------ 

expected output: 
------ 
4 
5 
double 
3 
double 
2 
9 
double 

나는이 프로그램을 작성하지만 제대로 메모리를 할당하지 않습니다. 누군가 나를 쓰기 방향으로 안내 할 수 있습니까?

int main(void) 
{ 
    int c; 

    int digit; 
    int count = 0; 
    int d_size = 1; 
    int init_size = 2; 
    int *p = (int *) malloc(sizeof(int) * init_size); 

    while((c = scanf("%i", &digit)) != EOF) 
    { 
     if (c == 1) 
     { 
      *(p+count) = digit; 
      count++; 
     } 
     else 
     { 
      printf("not valid"); 
     } 

     printf("%i\n", digit); 

     if (count >= 2) 
     { 
      printf("double\n"); 
      p = (int *) realloc(p, sizeof(int) * d_size); 
      d_size = d_size * 2; 
     } 

    } 
+5

젠장, 빌어 먹을 realloc과의 빌어 먹을 반환 값을 캐스팅하지 마십시오! –

+4

"메모리를 올바르게 할당하지 못했습니다."-보다 자세히 설명하십시오. 어떤 방법으로 작동하지 않습니까? –

+3

@ H2CO3 : +1 여기에 자주 * soooooo *가 표시되어 있기 때문에 +1이 있습니다. 이것은 C++이 아니므로'malloc' (이 경우에는'realloc')의 반환 값을 변환하지 마십시오! –

답변

4

귀하의 init_size 2,하지만 당신의 d_size이 동일 d_sizeinit_size에 확인 모든 1. 먼저입니다. 둘째로, 을 realloc 앞에 붙여야 실제로 크기를 늘릴 수 있습니다.


사이드 노트 : 메모리 부족 경우 realloc가 실패합니다. 작성한 경우 :

p = realloc(p, ...); 

오류가 발생하면 이전에 할당 된 메모리가 손실됩니다. 당신은 항상이 같은 realloc 사용해야합니다

enlarged = realloc(p, ...); 
if (enlarged == NULL) 
    // handle error 
else 
    p = enlarged; 

사이드 노트 2 : 포인터의 유형을 변경 끝낼 수 있습니다. 반복하지 않는 것이 좋습니다. 대신

int *p; 
p = (int *)malloc(sizeof(int) * count); 

의 쓰기 :

int *p; 
p = malloc(sizeof(*p) * count); 
+0

나에게 너무 늦은 1 초, 정확히 똑같은 것을 쓰고 싶었다. –