c언어 // free 함수관련 질문입니다.

조회수 2112회

제가 지금 스택을 배열으로 구현하고 있는데 아래와 같은코드에서

main함수속에서 copy한후 copy된 스택을 del을 하면서

free를 사용했을경우 컴파일 에러가 뜨지않는반면 실행시키면 free는 읽히는데 실행은 되지않아 질문드려요

copy함수안에서 _st_ar 입력받는 포인터 역시 free가 되지않네요 ㅠㅠ

main안에 변수는 모두 main내부에서 선언했습니다.

int *copy(int *_st_ar, int nsize,  int *_t)
{
    int i;

     int* _copy_ar = (int*)malloc(sizeof(int)*(nsize*2));
    for(i=0;i<nsize;i++)
    _copy_ar[i] = _st_ar[i];

    if(_st_ar != NULL)
    free(_st_ar);
    _st_ar = NULL;

    return _copy_ar;
}

void del(int *_copy_ar)
{
    free(_copy_ar);
   _copy_ar = NULL;
}

int main()
{
    // ...
    printf("copy the stack array\n");
    new_array = copy(stack_array, nsize, &top);
    printStack(stack_array, nsize);
    printStack(new_array, nsize*2);
    printf("destroy stack array\n");
    del(new_array);
    printStack(new_array, nsize*2);

    return 0;
}
  • 저 두 함수를 호출하는 main() 함수를 볼필요가 있을거 같아요. 유동욱 2017.10.20 12:55
  • printf("copy the stack array\n");///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// new_array = copyAR(stack_array, nsize, &top);/////////////////////////////////////////////////////////////////////////////////////////////////////////// printStackAR(stack_array, nsize);///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// printStackAR(new_array, nsize*2);/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// printf("destroy stack array\n");////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// delAR(new_array);////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// printStackAR(new_array, nsize*2);////////////////////////////////////////////////////////////////////////////////////////////////////////// 알 수 없는 사용자 2017.10.20 20:11
  • 위에서와 같이 선언해줍니다! main에서 사용하는 변수는 모두 main안에서 선언했습니다 알 수 없는 사용자 2017.10.20 20:17

1 답변

  • del() 을 통해 해제한 메모리를 사용해서 런타임에서 오류가 발생한 것입니다.

    작성해 주신 코드에서는 정상적으로 메모리를 해제하게 됩니다.

    말씀하시는 것으로 보아 해제되지 않는 다고 판단하신 기준이 포인터의 주소가 NULL 로 변경되지 않아서 그러는 것 같습니다.

    이는 함수 호출 과정에서 인자 전달이 call by value 이기 때문에 당연합니다.

    void del(int *_copy_ar) {
        free(_copy_ar);   
        _copy_ar = NULL;
    }
    

    여기서 _copy_ar = NULL; 을 하면 _copy_ar 변수에 NULL 이 저장되나, 호출 할때 입력한 변수에 NULL 이 저장되지는 않습니다. 호출에서 사용한 변수와 _copy_ar 는 다른 변수이기 때문입니다.

    따라서 호출에 사용한 변수또한 NULL 로 변경하고 싶으시다면

    void del(int**_copy_ar) {
        free(*_copy_ar);   
        *_copy_ar = NULL;
    }
    
    int main() {
        int* array = /* ... */;
        // ...
        del(&array);
        return 0;
    }
    

    와 같이 더블 포인터를 사용하는 방법을 이용해야합니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)