2017-12-08 29 views
-2

내가 물어보고 싶은 것은, 내가 메모리 관리에있어 무엇이 잘못되었는지. 난 그냥 stdin에서 일부 int 배열을 읽고 다음 그것을 인쇄 싶어요. 2 요소에서 시작하여 금액을 2로 할당하면 만족하게 될 것입니다.C에서 realloc()을 잘못 사용하면 어떻게됩니까?

#include <stdio.h> 
#include <stdlib.h> 

void read (int * array, int * n, int * l) { 
    int * tmp; 
    printf("Enter values:\n"); 
    for (*l = 0; *l < *n; (*l)++) { 
     if (*l == *n - 1) { 
      (*n) *= 2; 
      tmp = (int*) realloc (array, sizeof(int) * (*n)); 
      if (tmp != NULL) { 
       array = tmp; 
       free(tmp); 
      } 
      else { 
       printf("Error!\n"); 
       free(tmp); 
     } 
     if (scanf("%d", &array[*l]) != 1) break; 
    } 
} 

void print (int * array, int length) { 
    int i; 
    printf("Your values:\n"); 
    for (i = 0; i < length; i++) printf("%d ", array[i]); 
} 

int main (void) { 
    int n = 2; /* number of array elements */ 
    int length = 0; 
    int * array = (int *) malloc(sizeof(int) * n); 

    read(array, &n, &length); 
    print(array, length); 
    free(array); 
    return 0; 
} 
+9

'realloc'에 의해 반환 된 값을'main'에 전달하지 않으므로,'main'의 다음 줄은 이전의 해제 된 포인터 값을 사용합니다. –

+6

[Don 'malloc'의 결과를 C로 캐스팅하지 마라. (http://stackoverflow.com/q/605845/995714) –

+0

@Luru Vinh 구조체 블록에 메모리를 할당 할 때를 대비해서 때때로 캐스팅해야한다. malloc이 그것을 이해합니까? –

답변

1

: free(tmp);

이 문은 어디 게시 된 코드 안된다.

는 단지

==== 포인터가 'N'보다 배열을 가리키는 될 호출자, 즉 할당이 아니라, 고정 된 배열 된 할당 된 메모리를 해제

== == 포인터가 가리키는 곳에서 호출 된 함수가 변경 될 포인터를 전달할 때는 현재 시나리오에서 int **n으로 전달되어야합니다. 이것은 또한 호출하는 함수가 아닌 포인터의 내용이

==== 변수 (및 매개 변수) 이름이 '매개 변수 이름을 usage 또는 content (또는 더 나은, 둘 다)를 표시해야합니다 포인터의 주소를 통과해야 함을 의미 n '과'l '은 현재 상황에서도 의미가 없다.

+0

좋아요, read()에서 free (tmp)를 모두 제거하고 작업을 시작했습니다. 괜찮아요,하지만 왜이 새로운 기억을 풀 필요가 없나요? 내가 함수 read()를 떠난 후 자동으로 해제 되었습니까? –

+0

@DmytroOsaulenko, 질문에 대답해야하는'realloc()'의 MAN 페이지를 읽고 이해하도록 제안하십시오. – user3629249

0

성공적인 realloc 후 free를 제거하십시오. Realloc이 당신을 위해 그것을 처리합니다. 또한 오류 케이스에 충돌 한 경우 버퍼를 두 번 free()합니다.

+0

아니요, 그는 방금 할당 한 메모리를 해제하십시오 –

+0

그래서 read() 함수의 끝에 자유 (tmp)를 두어야합니까? –

+0

아니요, 유일한 무료 main();에 있어야합니다. realloc이 실패하면, 읽기 부족으로 보석금을 내야합니다. 배열이 가득차 있기 때문에 데이터를 넣을 곳이 없습니다. trust realloc(). – mevets

-1

EDIT 죄송합니다. 귀하가 복사하여 붙여 넣기 만 할 수있는 뭔가를 원했음을 깨닫지 못했습니다. 디자인 문제도 해결하겠습니다. 대한

#include <stdio.h> 
#include <stdlib.h> 

void read (int **array, int *len) { 
    int *tmp = *array; 
    int count = *len; 
    int i = 0; 
    int val = 0; 
    char buffer[32]; 

    printf("Enter values one at a time:\n"); 
    while (i < count) { 
    if (i == (count - 1)) { 
     tmp = realloc(*array, sizeof(*tmp) * (count *= 2)); 
     if (tmp) { 
     *array = tmp; 
     } 
     else { 
     printf("Allocation failed\n"); 
     return; 
     } 
    } 
    fgets(buffer, 32, stdin); 
    if (sscanf(buffer, "%d", &val) != 1) { 
     break; 
    } 
    tmp[i++] = val; 
    } 
    *len = i; 
} 

void print (int *array, int length) { 
    int i = 0; 

    printf("Your values:\n"); 
    while (i < length) { 
    printf("%d ", array[i++]); 
    } 
} 

int main (void) { 
    int len = 2; 
    int *array = malloc(sizeof(*array) * len); 

    read(&array, &len); 
    print(array, len); 
    free(array); 
    getchar(); 
    return 0; 
} 
+0

코드를 복사했습니다. 그것은 작동하지만 ... 예를 들어 20 개의 값을 입력하고 15 개만 얻습니다. 뭐가 잘못 됐나요? –

+0

이것은 주로 _your_ 코드입니다. 디버거에서 단계별 실행을 시도 했습니까? –