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;
}
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
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; }
와 같이 더블 포인터를 사용하는 방법을 이용해야합니다.
댓글 입력