본문 바로가기

카테고리 없음

독하게 공부하는 C 스터디 함수응용, 구조체

 

 

 

<함수 응용>

 

매개변수 전달 기법

- 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() 하면 연접 해제!

 

 

시스템의 보안 설정을 바꾸는 것 보단 연접이 필요한 경우에만 전처리기로 수정하는 게 좋음.