<함수 응용>
매개변수 전달 기법
- Call by value : 매개변수 전달시 값 자체를 전달 ex. add(4);
- Call by reference : '참조' 로 전달 -> C언어에서 참조는 포인터!
포인터로 전달하여 Callee 함수에서도 해당 메모리에 접근할 수 있음.
- 인수 = 매개변수 = 파라미터 = 아규먼트
- 매개변수는 Stack영역 사용
지역변수 주소 반환 요류
- Caller 함수가 Callee함수를 호출하고, Callee가 값을 return하면
Callee함수의 지역변수는 모두 소뮬됨
- 따라서 반환 후에 Caller함수에서 소멸된 메모리 영역의 주소를 접근하면 심각한 오류 생김
주의!! 절대 하면 안됨! 컴파일러가 경고 할 것
메모리 동적 할당 및 해제와 함수
-Callee함수가 메모리 동적 할당하고 반환한다면,
-동적할당한 메모리에 대한 메모리 해제를 확실히 해줘야 함.
- 할당된 메모리 크기 전달문제 고려 -> 왜? 포인터로 보통 전달하는데, 포인터로는 메모리 크기를 알 수 없기 때문에
별도로 메모리 크기를 명시하는 등의 액션이 필요함.
재귀 호출
- 함수 코드 내부에서 다시 자신을 호출하는 것
- 반복문 + Stack 자료 구조.
- 반복문(논리구조)의 문제 : endless loop
따라서 이거 생기지 않도록 검증 필요. - 안그럼 stack overflow발생
- 비선형 자료구조 (ex. tree) 에서 매우 중요하게 활용.
문자 처리 함수
- strcat(), strpbrk(), strtok() 는 parser에 사용됨!
<구조체>
구조체
- 여러 자료형을 모아 새로운 하나의 형식으로 기술
- 배열은 동일한 자료형, 구조체는 여러 자료형을 모은 것.
- 구조체는 인덱스는 없음.
- 구조체를 이루는 요소를 멤버라고 부름
- 구조체 변수를 통해 개별 요소에 접근할 때는 멤버접근 연산자를 사용 (.)
- 구조체 변수(인스턴스) 선언 시 초깃값 기술시엔 반드시 멤버 선언 순서에 맞춰야 함.
- typedef 선언을 동반하는 것이 일반적.
보통 구조체를 쓰는 이유는? s/w 개발할 때 자동화, 전산화 , DB 관리 등에 사용된다~~
ex) RDBMS 의 테이블이 구조체로 기술하기 용이함.
구조체 관리
- 구조체도 배열 선언 가능
- malloc() 함수로 동적 선언해 관리하는 경우도 일반적
- 구조체에 대한 포인터 변수 선언 시 멤버 접근 연산자가 달라짐(->)
- 함수 반환형이나 매개변수로 사용 가능.
이때 구조체 자체를 전달하면 너무 덩치가 크기에 포인터로 전달하라!!
구조체를 멤버로 갖는 구조체
- 구조체 변수도 다른 구조체의 멤버가 도리 수 있음.
- 이 경우 컴파일러에게 선언 알려야 하므로 기술 순서 중요
- 자기 자신에 대한 포인터를 멤버로 갖는 구조체 = 자기 참조 구조체
자료구조의 연결리스트에 자주 사용됨.
비트 필드
- 1바이트 (8비트) 정보를 쉽게 잘라 쓰기 위한 문법
- 멤버는 비트단위 데이터
- 멤버 선언 시 먼저 기술한 멤버는 8비트 중 오른쪽부터 적용
- 임베디드 시스템 등에 사용되는 특수한 구조체임.
공용체
- TCP/IP Socket등에 활용
- IP 주소는 32bit는 192.168.0.1 처럼 생겼는데 한 파트씩 잘라서 관리 가능함.
- 한 대상에 대해 여러 해석방법을 부여하는 문법
- 32비트 정수에 대해 int, short[2], char[4]로 해석 가능
- 이렇게 쓰는 이유는 int이지만 어떠한 숫자만 콕 집어내고 싶을 때 사용하기 위함.
구조체 멤버 맞춤
- 기본적으로 구조체를 이루는 멤버의 메모리공간은 관리 편의를 위해
완전히 연접하지 않고 일정 단위로 메모리를 구성함
- 완전히 연접해야 할 경우 전처리기 이용해 설정 변경
#pragma pack()
#pragma pop() 하면 연접 해제!
시스템의 보안 설정을 바꾸는 것 보단 연접이 필요한 경우에만 전처리기로 수정하는 게 좋음.