본문 바로가기

C언어

(22)
makefile 만들기 컴파일 작성한 코드에 구문검사를 해서 구문에 이상이 있다면 오류를 내주어 작성한 유저에게 알려주고 만약 검사에 이상이 없다면 프로그램이 시작되기 전에 메모리에 올라간다. 이처럼 컴파일의 역할은 유저가 작성한 코드에 이상이 없는지 검사하고 코드에 작성된 변수나 함수들을 메모리에 올려주는 역할을 한다. 링크 프로그램을 만드는 마지막 작업이 바로 링크(Link)라는 과정이다. 필요한 조각들을 모두 모으거나 어떤 부분이 빠져 있는지 알아보기 위한 과정이다. 정적 라이브러리(Static Library)를 사용할 때, 링커는 프로그램이 필요로 하는 부분을 라이브러리에서 찾아서 그냥 실행파일에다 카피해버린다. 공유 라이브러리(또는 동적 라이브러리)의 경우에는 이렇게 하는 것이 아니라 실행파일에다가 단지 "실행될 때 ..
Chapter 18. 메모리 할당과 해제 Chapter 18.메모리 할당과 해제 시스템으로부터 메미로를 할당 받는다는 것은 시스템에서 사용하고 있지 않은 메모리 영역을 배정받고 이에 대한 주소를 얻는 것이다. 동적 메모리는 "절대" 변수를 통해서 접근할수없다. 포인터 변수에 의해서만접근이 가능하다. 포인터 변수에 의해서 접근할 수 있는 영역은malloc()에 의해서 생성될 수 있다. C 프로그램에서의 메모리 구조는 다음과 같다. 1. 텍스트 영역(TextSegment) CPU에 의해서수행되는 기계어 명령어들이 모여 있는 곳을 지칭한다. 2.초기화된 데이터 영역(Initialized Data Segment) 프로그램에서 초기화된 데이터 들이 모여 있는 장소이다. int imsi = 100; 3.비 초기화된 데이터 영역(Uninitialized D..
Chapter 19. 라이브러리 Chapter 19.라이브러리 #include main() { if((fp= fopen("imsi", "r")) == NULL) { puts("그런 파일이 존재 하지 않습니다."); exit(0); } ... } 위의 프로그램에서 에러 처리하는 부분은 원시적인방법이다. 이를 좀더 세련되게 변형시켜보자. #include main() { void Fatal(char*); FILE *fp; if((fp= fopen("imsi", "r")) == NULL) Fatal("fopen"); ... } voidFatal(char *error_func) { perror(error_func); exit(0); } 에러가 발생하면 시스템적으로 에러 번호가 생성되는데, 이를 받아서 처리하는 함수가 perror()이다. fop..
Chapter 15. 함수 인자 포인터 Chapter 15.함수 인자 포인터 함수에 인자 넘기는 포인터는 지칭한다. 이것을 잘 모르면변수를 잘 정의하고 사용할 지라도 다른 함수에 넘길 수 없기때문에 현재의 함수 안에서만 포인터 변수를 사용하게 될지도 모른다. 1차원 함수 인자 포인터 15_1.c #include main() { void add(int *); int imsi; imsi = 100; add(&imsi); printf("imsi : %d\n", imsi); } void add(int *imsi) { *imsi = 1024; } gcc-o 15_1 15_1.c ./15_1 imsi : 1024 위 프로그램은 포인터를 다른 함수에 넘기기 위해서 어떻게 함수의 원형을 선언하고 본체는 어떻게 작성해야 하는지 그리고 호출할 때 주의할 것은 ..
Chapter 16. 함수 포인터 Chapter 16.함수 포인터 함수를 가리킬 수 있는 포인터!! 많이 사용되지는 않지만 수치해석과 같은 분야에서 함수 포인터가 없다면 상당히 프로그램이 복잡해짐을 느낄 수 있을 것이다. 트리를 순회하는데 재귀함수 기능이 없다면 구현에 훨씬 많은 시간과 노력이 필요할 것이다. 함수 포인터의 개념과 기본적인 활용에 대해 간단히 짚고 넘어가자. 함수 포인터의정의 type (*name)(arg list); "name"은 함수를 가리킬 수 있는 포인터 변수이다. 그러므로name에 대한4byte가 할당된다. "type"은name이 가리키는 함수가 리턴하는 형(type)을 말하고,"arg list"는 name이 가리키는 함수의 매개변수 리스트이다. int (*imsi)(int, char *); imsi가 가리키는 ..
Chapter 17. 구조체와 포인터 Chapter17.구조체와포인터 구조체의 정의하면 다음과 같이 2가지로 말할 수 있겠다. 변수들이 모여 있는 집합체이다. 변수들은 다른 타입을 가질 수 있다. 이 집합체는 논리적으로 관련이 있으며 하나의 이름으로 통칭한다. 사실 구조체를 사용하지 않고 배열을 사용할 수도 있다. 하지만, 구조체를 사용하면 변수들이 논리적으로 하나가되기 때문에 인식하기가쉽고 프로그래밍을 하기도 편하다. 구조체와 배열의 차이 주소록에는 이름과 생년월일, 주소, 전화 번호 등이 포함되어 있다.이를배열로 표현하면 아래와 같다. char name[20],address[100], birthday[11], phone[15]; 위의 배열 정의는 한 사람만 저장할 수 있으며, 만약 50명을 저장하려 한다면 2차원 배열을 이용해야 한다. ..
Chapter 13. (int *)pointer Chapter 13.(int*)pointer int pointer= 5; (int *)pointer (int *)pointer를 이용해서 나온 값과 그냥pointer를 이용해서 출력되는 값은 어떤 차이점이 있을까? 캐스트 연산자의 이해 13_1.c #include main() { int pointer = 5; printf("(int *)pointer = %#010x\n", (int *)pointer); } gcc -o 13_1 13_1.c ./13_1 (int *)pointer = 0x00000005 위의예제를통해 결과를확인하기 전에"5가 메모리 어딘가에 저장디어 있고이곳의 번지를 리턴할 것이다"라고 예상한다. 하지만, pointer변수에 들어 있는 정수 값이 출력된다. 위의 질문에 대한 결론을 말하자면..
Chapter 14. void형 포인터 Chapter 14.void형 포인터 널 포인트는 아무것도 가리키지 않는 포인터였다. void형 포인트는 그와 반대로어느 것이든 가리킬 수 있는 포인터이다. 좀더 자세히말하면void형 포인터는 현재 가리키고 있는 대상체가 정해져 있지않은 포인터가 된다. void *imsip; imsip는가리키는 대상체가 정해져 있지 않은 포인터 변수라고 정의했다. 따라서,imsip 안에는 분명 주소 값이 저장되어 있을 것이다. 그렇다면, 현재 가리키고 있는 주소 값에서 몇 byte를 읽어올 것인가에 대한 질문이 된다. imsip 자체는 가리키는 대상체가 따로 지정? 있지 않기 때문에 몇byte를 읽어올 지 알 수가 없다. void형포인터변수가 가리키는 주소에서 몇byte를 읽어올 지 결정하는 것은캐스트 연산자이다. vo..