들어가며
오늘 다음주에 있을 프로젝트의 조를 꾸리는 시간이 있었다. 4인 1조를 꾸려서 프로젝트를 진행하면 되는데 내가 조장 리스트에 들어가있었다. (유후!) 학생들을 알아서 모집해야 하는 시스템이라 사실 조금 걱정했었는데, 같이 하자고 먼저 연락해주는 분들이 많았어서 빠르게 모집 마감을 할 수 있었다. 후 ㅎㅎ. 인생을 잘 살아둬서 다행이야. 사실 프로젝트 하면 Git 사용하는 방법도 가르쳐주고 내가 프로젝트 팀원들의 코드리뷰도 다 해주려고 했는데, 기획과 발표를 포함해서 단 5일 안에 진행이 되어야하다보니, 다 할 수 있을지는 잘 모르겠다. 그저 열심히 해봐야겠다는 생각 뿐이야.
ㅤ
오늘 C언어 시험을 쳤는데, 너무 집중을 안했나,,, 틀린문제 6개 중에 1개는 확실히 모르는거 / 2개는 다시 보니 맞는말인거 / 3개는 주의를 안해서 틀린 문제들이였다. pa 인데 *pa 를 써넣었다거나, 알고있는 bit 연산 규칙도 잘못 다뤘다거나… 좀 아쉽네 ;ㅅ;
오랜만의 시험이라 그렇다 생각하고, 다음번 시험에서는 조금 더 집중해서 문항들을 살펴볼 필요가 있겠다.
ㅤ
오늘의 키워드
메모리를 할당 받을 때는 잘 받았나 체크하기
메모리 할당 함수를 사용할 때는
// 메모리를 재할당할 때 ptr 변수에 바로 넣지 않기
p = realloc(p, SIZE);
int* temp_p = realloc(p, SIZE);
ㅤ
메모리 해제 실수 줄이기
할당받은 메모리를 해제할 때, 아래처럼 매크로를 작성하면 [할당해제 + 포인터에 0 대입] 을 한 번에 처리할 수 있기 때문에 실수를 줄일 수 있어서 유용하다.
#define FREE(ptr) do { \
free(ptr); \
(ptr) = NULL; \
} while(0)
ㅤ
FREE 시 동적할당받은 메모리 포인터에 0을 대입하는 것은 아래 이유를 가짐.
// 1. dangling pointer 제거
free(p);
*p => 읽기 엑세스 위반 throw 발생
// 2. free 시 런타임 오류 제거
free(p);
free(p); => 이미 해제한 주소 해제 시도 시 에러 발생
free(p);
p = NULL;
free(p); => 0 주소를 해제하는 것은 정상적으로 실행 가능
ㅤ
왜 매크로 블럭이 do { … } while(0) 이냐면
- 단순히 세미콜론으로 한 줄에 끝낸 경우
#define FREE(ptr) free(ptr);(ptr)=NULL;
if(true)
FREE(ptr);
// 위 코드가 이렇게 변경됨
if(true)
free(ptr);
ptr = NULL;;
// 그러면 이렇게 해석될 수 있음
if(true)
free(ptr);
ptr = NULL;;
- 중괄호로 감싼 경우
#define FREE(ptr) do { \
free(ptr); \
(ptr) = NULL; \
}
if(true)
FREE(ptr);
else
puts("");
// 위 코드가 이렇게 변경됨
if(true)
{ free(ptr); ptr = NULL; };
else
puts("");
// 그러면 이렇게 해석될 수 있음
if(true) {
free(ptr);
ptr = NULL;
};
// if문 구조의 끝 + 짝 없는 else 등장
else
puts("");
- (콤마 , 연산자)로 감싼 경우
#define FREE(ptr) (free(ptr), (ptr)=NULL)
// 요거슨 expression
// 이런 이상한 코드가 작성될 수 있음.
int result = FREE(ptr);
ㅤ
do-while은 반드시 세미콜론으로 끝나야하는 문장임. 따라서 FREE(ptr); 처럼 사용할 때 자연스럽게 세미콜론을 붙이더라도 문법적인 문제가 없음!
ㅤ
매크로 블럭을 쓰고 싶으면 do-while(0) 블럭을 사용하자.
ㅤ
'TIL' 카테고리의 다른 글
| [250825] Day 15 - 드디어 프로젝트를 시작합니다! (2) | 2025.08.25 |
|---|---|
| [250824] Day 14 - 즐거운 주말 (0) | 2025.08.25 |
| [250821] Day 11 - C언어는 모든게 포인터인가요 (0) | 2025.08.22 |
| [250820] Day 10 - &&__ ** 별보러가자 (0) | 2025.08.21 |
| [250819] Day 9 - 개인교사 데뷔전 (0) | 2025.08.20 |