- 개요
- 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)