본문 바로가기

카테고리 없음

[언어공부] <c> free()와 NULL포인터

  • 개요
    • void free(void *ptr)
    • 동적할당된 메모리를 해제한다.
  • 주의할 점
    • 동적할당된 메모리가 아니라면 free()할수 없다.
#include <stdlib.h>

int main()
{
	char *str = "hello";
    free(str)
}

//-----result------------
/*
free(): invalid pointer
signal: aborted (core dumped)
*/
  • 매개변수로 받은 경우
    • free()를 했다면, 해당 메모리가 해제되었다는것을 알려주기위해, 그 포인터를 NULL포인터로 만들어야 한다. 
    • free()의 경우 둘 모두 정상적으로 작동했다. 하지만, 전자의 경우 포인터가 NULL포인터가 되지않은걸 알수 있다.
    • 함수의 매개변수로 문자열의 주소를 줬는데, 이는 값을 준것이고, str과 s 가 같은 변수라는 말은 아니다.
    • 따라서 s를 NULL포인터로 한다 한들 str이 NULL포인터가 되는것은 아니다. 
    • 이를 위해 후자처럼 더블포인터를 사용해서 매개변수로 넘겨줘야한다.
#include <stdio.h>
#include <stdlib.h>

char  *func(char *s)
{
  free(s);
  s = NULL;
  return (NULL);
}

int main(void) {
  char *str;

  str = (char *)malloc(sizeof(char) * 6);
  for (int i=0; i<6; i++)
      str[i] = '0' + i;
  
  printf("%s\n", str);
  
  func(str);
  printf("%s\n", str);

}

//---------result-------------
012345
#include <stdio.h>
#include <stdlib.h>

char  *func2(char **s)
{
  free(*s);
  *s = NULL;
  return (NULL);
}

int main(void) {
  char *str2;

  str2 = (char *)malloc(sizeof(char) * 6);
  for (int i=0; i<6; i++)
      str2[i] = '0' + i;
  
  printf("%s\n", str2);

  func2(&str2);
  printf("%s\n", str2);
}

//----------------result------------
012345
(null)